Python DataFrame:将DataFrame中的值替换为具有相同索引和列的其他DataFrame

问题描述 投票:0回答:2

我有两个数据帧。 “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”中,这对应于相同的索引和列?谢谢!

python pandas dataframe replace match
2个回答
1
投票

你可以使用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

使用NaNs的另一个解决方案是加入DataFrames并通过索引删除重复行:

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

0
投票

如果您没有任何NA,此功能应该有效:

df = df.update(df_result)

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

© www.soinside.com 2019 - 2024. All rights reserved.