使用另一个数据帧处理一个数据帧



>我有两个数据框:df1和df2。它们都包括"ID"、"姓名"、"分数"和"状态"等信息,如果该人在 df1 中的状态是"编辑",我需要更新 df2 中的"分数",如果该人在 df1 中的状态是"取消",我还需要删除 df1 中的行。

例如:

dic1 = {'ID': [1, 2, 3],
'Name':['Jack', 'Tom', 'Annie'],
'Score':[20, 10, 25],
'Status':['New', 'New', 'New']}
dic2 = {'ID': [1, 2],
'Name':['Jack', 'Tom'],
'Score':[28, 10],
'Status':['Edit', 'Cancel']}
df1 = pd.DataFrame(dic1)
df2 = pd.DataFrame(dic2)

输出应如下所示:

ID  Name  Score  Status
1  Jack     28    Edit
3  Annie    25    New

有什么指示或提示吗?

首先使用左连接的DataFrame.merge,然后过滤掉原始DataFrameCancel行和以_结尾的列:

df = df1.merge(df2, on=['ID','Name'], how='left', suffixes=('_', ''))
df = df.loc[df['Status'] != 'Cancel', ~df.columns.str.endswith('_')]
print (df)
ID  Name  Score Status
0   1  Jack     28   Edit

编辑 添加DataFrame.combine_first以恢复缺少的行:

df = df1.merge(df2, on=['ID','Name'], how='left', suffixes=('', '_'))
df = df.loc[df['Status_'] != 'Cancel']
df1 = df.loc[:, df.columns.str.endswith('_')]
df = df1.rename(columns=lambda x: x.rstrip('_')).combine_first(df).drop(df1.columns, axis=1)
print (df)
ID   Name  Score Status
0  1.0   Jack   28.0   Edit
2  3.0  Annie   25.0    New

使用熊猫。DataFrame.update commnad of pandas package.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.update.html

df1.update(df2)
print(df1)
df1 = df1[df1.Status != "Cancel"]
print(df1)