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