Pandas 是否有办法根据表中类似表的新值替换表中1列的旧值

Pandas 是否有办法根据表中类似表的新值替换表中1列的旧值,pandas,updates,Pandas,Updates,我有一个表,包含15k行,它显示了一个过期的who帐户 有人付钱,谁没付钱。第二张表显示了人员的id和帐户 谁付了钱。我正在试图找出更新第一个表的最佳方法 从逾期到付款。 这是第一个名为“过期”的表 这是第二个更新表,基于月底的“已支付”结算 表“ 我想让桌子看起来像这样 Id Name Account 300 Sandy paid 301 Stack paid 302 Que p

我有一个表,包含15k行,它显示了一个过期的who帐户 有人付钱,谁没付钱。第二张表显示了人员的id和帐户 谁付了钱。我正在试图找出更新第一个表的最佳方法 从逾期到付款。 这是第一个名为“过期”的表

这是第二个更新表,基于月底的“已支付”结算 表“

我想让桌子看起来像这样

 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'

检查
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

您还可以使用合并来选择列:

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 [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中的每个id都存在于df1中。如果不是这样,您应该创建一个带有外部联接的新数据帧,而不是更新df1。

我尝试使用上述语法,但由于某种原因,它给了我以下错误:无法从重复轴重新编制索引。任何关于如何克服df2中的所有内容也都在df1中的想法。使用您提供的查询时,我只得到df2中的同一行,但没有df1中的idback@cesco我不明白你的问题,你能试着用一个例子解释一下吗?或者指向df1中不正确/缺失的索引df1有20k行,df2有3k行。df2中的所有id也可以在df1中找到。目标是根据df2的更新版本更改df1帐户中的信息。当我跟踪您的查询时,只返回df2中的行和df1的列。我希望这次我能解释清楚。谢谢你的帮助help@cesco真奇怪,我想这应该行得通。我稍后会试一试,也许我错过了什么
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