This question already has answers here:
Merge and update dataframes based on a subset of their columns
(3 个回答)
3年前关闭。
例如,我有两个数据框
df1:
df2:
我想用 df2 中的相应条目覆盖 df1 中的条目。
例如,用 df2.loc[2,2] 覆盖 df1.loc[5,3]。也就是说,对于'Name'相同的行,如果df1在df2中,则覆盖df1的同一列。
目前,我正在以一种愚蠢的方式这样做:
我并不以此为荣。我做了一些研究,想出了用 set_value() 替换 '=' 的方法,这很有帮助。我真的很期待听到其他建议。实际问题的大小是 200 行 30 列。因此,运行所有 for 循环需要 20 秒。
(3 个回答)
3年前关闭。
例如,我有两个数据框
df1:
0 1 2 3
0 Name Unit Attribute Date
1 a A xxy xxx
2 b B xyx xxx
3 c C xxx xxx
4 d D yxx xxx
5 e E yxy yyy
df2:
0 1 2
Name Unit Date
0 a F xxx
1 b G xxx
2 e H xxx
3 f I xxx
我想用 df2 中的相应条目覆盖 df1 中的条目。
例如,用 df2.loc[2,2] 覆盖 df1.loc[5,3]。也就是说,对于'Name'相同的行,如果df1在df2中,则覆盖df1的同一列。
目前,我正在以一种愚蠢的方式这样做:
def find_column_num(key, df_name, start_row, stop_row, start_column, stop_column):
for i in range(start_row,stop_row+1):
for j in range(start_column, stop_column+1):
if df_name.loc[i,j]== key:
column_num_with_key = j
return column_num_with_key
break
for i in range(0,len(df1.index)):
for ii in range(0,len(df2.index)):
if df1.loc[i,0] == df2.loc[ii,0]:
for j in range(0,len(df1.columns)):
if df1.loc[0,j] in df2.loc[0,:]:
df1.set_value(i,j, df2.loc[ii,find_column_num(df1.loc[0,j],df2,0,0,0,len(df2.columns))]
我并不以此为荣。我做了一些研究,想出了用 set_value() 替换 '=' 的方法,这很有帮助。我真的很期待听到其他建议。实际问题的大小是 200 行 30 列。因此,运行所有 for 循环需要 20 秒。
最佳答案
IIUC,使用 merge
和 fillna
。您需要稍微清理一下数据。这是我用来引用的。
df1
Name Unit Attribute Date
0 a A xxy xxx
1 b B xyx xxx
2 d C xxx xxx
3 e D yxx xxx
4 e E yxy xxx
df2
Name Unit Date
0 a F xxx
1 b G xxx
2 e H xxx
3 f H xxx
out = df1[['Name', 'Attribute']].merge(df2, how='left').fillna(df1)
out
Name Attribute Unit Date
0 a xxy F xxx
1 b xyx G xxx
2 d xxx C xxx
3 e yxx H xxx
4 e yxy H xxx
关于python - 如何加快数据帧搜索和赋值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46219850/
10-14 08:48