【问题标题】:Python DataFrame: replacing values from DataFrame to other DataFrame with same index and columnsPython DataFrame:将值从 DataFrame 替换为具有相同索引和列的其他 DataFrame
【发布时间】:2018-06-02 18:30:56
【问题描述】:

我有两个数据框。 “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


【解决方案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

您可以使用loc通过索引和列名称设置df

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

【讨论】:

  • 这是否也适用于 np.nan 值?如果 df 有比 df_result 更多的列?感谢您的回答
【解决方案2】:

如果您没有任何 NA,此功能应该可以工作:

df = df.update(df_result)

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

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2021-05-26
    • 2021-12-17
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多