Есть ли способ заменить старые значения 1 столбца таблицы на основе нового значения аналогичной таблицы в пандах - PullRequest
1 голос
/ 22 мая 2019

У меня есть 1 таблица, содержащая 15 тыс. Строк, и она показывает просроченный счет того, кто заплатил, а кто не заплатил. 2-я таблица показывает идентификатор и учетную запись людей кто заплатил. Я пытаюсь найти лучший способ обновить первую таблицу от просроченного к платному. это первая таблица с именем "просрочено"

Id         Name      Account
300         Sandy      paid
301        Stack       paid
302        Que         overdue
303         Liz        overdue
304        Grace       overdue
305          DP        overdue
306        Batty       overdue
307         tako       overdue

это вторая обновленная таблица на основе закрытия месяца "оплачено" стол "

 Id         Name      Account
 300         Sandy      paid
 301        Stack       paid
 302        Que         paid
 303         Liz        overdue
 304        Grace       paid
 305          DP        paid
 306        Batty       paid
 307         tako       paid

Я пытаюсь, чтобы таблица выглядела так.

 Id         Name      Account
 300         Sandy      paid
 301        Stack       paid
 302        Que         paid
 303         Liz       overdue
 304        Grace       paid
 305          DP        paid
 306        Batty       paid
 307         tako       paid

Я попробовал этот код и не уверен, что лучший способ сделать это для 15k ID, который имеет обновленный аккаунт

df1.loc[df1['ID'] == 300, ['Name']] = 'Paid'

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Проверка с update

df1.set_index('Id',inplace=True)
df1.update(df2.set_index('Id')[['Account']])
df1.reset_index(inplace=True)
df1
Out[289]: 
    Id   Name  Account
0  300  Sandy     paid
1  301  Stack     paid
2  302    Que     paid
3  303    Liz  overdue
4  304  Grace     paid
5  305     DP     paid
6  306  Batty     paid
7  307   tako     paid
1 голос
/ 22 мая 2019

Вы также можете выбрать столбец с помощью слияния:

In [11]: df2.merge(df1[["Id"]], how="right")["Account"]
Out[11]:
0       paid
1       paid
2       paid
3    overdue
4       paid
5       paid
6       paid
7       paid
Name: Account, dtype: object

Чуть более эффективно (выбрав только нужные вам столбцы):

In [12]: df2[["Id", "Account"]].merge(df1[["Id"]], how="right")["Account"]
Out[12]:
0       paid
1       paid
2       paid
3    overdue
4       paid
5       paid
6       paid
7       paid
Name: Account, dtype: object

Теперь вы можете обновить:

In [13]: df1.update(df2[["Id", "Account"]].merge(df1[["Id"]], how="right")["Account"])

In [14]: df1
Out[14]:
    Id   Name  Account
0  300  Sandy     paid
1  301  Stack     paid
2  302    Que     paid
3  303    Liz  overdue
4  304  Grace     paid
5  305     DP     paid
6  306  Batty     paid
7  307   tako     paid

Примечание. Оба они предполагают, что каждый идентификатор в df2 существует в df1.если это не так, вы должны создать новый DataFrame с внешним объединением, а не обновлять df1.

...