我有两个数据帧: df1和df2。它们都包括像'ID','Name','Score‘和' status’这样的信息,我需要的是更新df1中的'Score‘,如果此人在df2中的状态为“编辑”,并且如果此人在df2中的状态为"Cancel“,我还需要删除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
有什么建议或提示吗?
发布于 2019-05-10 09:02:47
首先使用带有左连接的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
为替换缺少的行编辑Add 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
发布于 2019-05-10 09:44:06
使用pandas包的pandas.DataFrame.update通信。
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)
https://stackoverflow.com/questions/56074040
复制相似问题