首页 > 解决方案 > 使用另一个 Pandas DataFrame 填写 Pandas DataFrame 中的 NA 值

问题描述

import pandas as pd


df1 = pd.DataFrame({
                  'value1': ["a","a","a","b","b","b","c","c"],
                  'value2': [1,2,3,4,4,4,5,5],
                    'value3': [1,2,3, None , None, None, None, None],
                    'value4': [1,2,3,None , None, None, None, None],
                    'value5': [1,2,3,None , None, None, None, None]})

df2 = pd.DataFrame({
                  'value1': ["k","j","l","m","x","y"],
                  'value2': [2, 2, 1, 3, 4, 5],
                  'value3': [2, 2, 2, 3, 4, 5],
                  'value4': [3, 2, 2, 3, 4, 5],
                  'value5': [2, 1, 2, 3, 4, 5]})

df1 = 
  value1  value2  value3  value4  value5
0      a       1     1.0     1.0     1.0
1      a       2     2.0     2.0     2.0
2      a       3     3.0     3.0     3.0
3      b       4     NaN     NaN     NaN
4      b       4     NaN     NaN     NaN
5      b       4     NaN     NaN     NaN
6      c       5     NaN     NaN     NaN
7      c       5     NaN     NaN     NaN

df2 = 
  value1  value2  value3  value4  value5
0      k       2       2       3       2
1      j       2       2       2       1
2      l       1       2       2       2
3      m       3       3       3       3
4      x       4       4       4       4
5      y       5       5       5       5

我想用 df2 中的值填充 df1 中的 NaN

所以 df1 的结果看起来像

df1 = 
  value1  value2  value3  value4  value5
0      a       1     1.0     1.0     1.0
1      a       2     2.0     2.0     2.0
2      a       3     3.0     3.0     3.0
3      b       4     2       2       1
4      b       4     2       2       2
5      b       4     3       3       3
6      c       5     4       4       4
7      c       5     5       5       5

我使用了以下代码。

tmp1 = df1[df1.value1 == 'b'].iloc[:, 2:]
tmp2 = df2.iloc[1:, 2:]

tmp1 = tmp2 可以更新 tmp1 中的值,但是当我使用以下

df1[df1.value1 == 'b'].iloc[:, 2:]= tmp2

它不会更新 df1 中的值,如下所示。

  value1  value2  value3  value4  value5
0      a       1     1.0     1.0     1.0
1      a       2     2.0     2.0     2.0
2      a       3     3.0     3.0     3.0
3      b       4     NaN     NaN     NaN
4      b       4     NaN     NaN     NaN
5      b       4     NaN     NaN     NaN
6      c       5     NaN     NaN     NaN
7      c       5     NaN     NaN     NaN

为什么会发生,我该如何解决这个问题?

谢谢你。

标签: pythonpandasdataframe

解决方案


这条线没有做你认为它正在做的事情:

tmp1 = df1[df1.value1 == 'b'].iloc[:, 2:]

方法是按顺序应用的,因此df1[df1.value1 == 'b']只保留行3, 4, 5df1但这不是您想要的,您想从满足条件的第一个实例开始更新所有行。

相反,首先找到所需的索引。

idx = df1['value1'].eq('b').values.argmax()

然后,您需要显式分配最后ndf2

df1.iloc[idx:, 2:] = df2.iloc[-(len(df1.index)-idx):, 2:].values

print(df1)

  value1  value2  value3  value4  value5
0      a       1     1.0     1.0     1.0
1      a       2     2.0     2.0     2.0
2      a       3     3.0     3.0     3.0
3      b       4     2.0     2.0     1.0
4      b       4     2.0     2.0     2.0
5      b       4     3.0     3.0     3.0
6      c       5     4.0     4.0     4.0
7      c       5     5.0     5.0     5.0

推荐阅读