>我有两个数据框: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
,然后过滤掉原始DataFrame
中Cancel
行和以_
结尾的列:
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)