我有两个数据帧。 “df”是我的原始数据帧,具有100000+个值,“df_result”是另一个仅包含某些具有某些df索引的列。我更改了“df_result”列中的值,并希望将其应用回原始数据框“df”。我已经映射了列名和“df_index”的索引以匹配“df”的正确索引,但它不包含“df”的每个索引。 (例如,df.index()输出为[0,1,2,.....,92808,92809],df_result.index()输出为[23429,23430,32349,42099,45232,.... 。,91324,91423])。有没有有效的方法将“df_result”中的每个值都放到原来的“df”中,这对应于相同的索引和列?谢谢!
你可以使用combine_first
:
df = pd.DataFrame({'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
print (df)
A B C D E F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
df_result = pd.DataFrame({'A':list('abc'),
'B':[4,5,4],
'C':[7,9,3],
'D':[5,7,1],
'E':[5,3,6],
'F':list('klo')}, index=[2,4,5])
print (df_result)
A B C D E F
2 a 4 7 5 5 k
4 b 5 9 7 3 l
5 c 4 3 1 6 o
df = df_result.combine_first(df)
print (df)
A B C D E F
0 a 4.0 7.0 1.0 5.0 a
1 b 5.0 8.0 3.0 3.0 a
2 a 4.0 7.0 5.0 5.0 k
3 d 5.0 4.0 7.0 9.0 b
4 b 5.0 9.0 7.0 3.0 l
5 c 4.0 3.0 1.0 6.0 o
使用NaN
s的另一个解决方案是加入DataFrame
s并通过索引删除重复行:
df = df_result.append(df)
df = df[~df.index.duplicated()].sort_index()
print (df)
A B C D E F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 a 4 7 5 5 k
3 d 5 4 7 9 b
4 b 5 9 7 3 l
5 c 4 3 1 6 o
编辑:
这也适用于np.nan值吗?如果df有更多的列,那么df_result?
df = pd.DataFrame({'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[np.nan,4,8,9,4,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
print (df)
A B C D E F
0 a 4 NaN 1 5 a
1 b 5 4.0 3 3 a
2 c 4 8.0 5 6 a
3 d 5 9.0 7 9 b
4 e 5 4.0 1 2 b
5 f 4 3.0 0 4 b
df_result = pd.DataFrame({'A':list('abc'),
'B':[np.nan,50,40],
'E':[50,30,60],
'F':list('klo')}, index=[2,4,5])
print (df_result)
A B E F
2 a NaN 50 k
4 b 50.0 30 l
5 c 40.0 60 o
您可以使用df
通过索引和列名设置loc
:
df.loc[df_result.index, df_result.columns] = df_result
print (df)
A B C D E F
0 a 4.0 NaN 1 5 a
1 b 5.0 4.0 3 3 a
2 a NaN 8.0 5 50 k
3 d 5.0 9.0 7 9 b
4 b 50.0 4.0 1 30 l
5 c 40.0 3.0 0 60 o
如果您没有任何NA,此功能应该有效:
df = df.update(df_result)
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html