python - 使用另一个 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
为什么会发生,我该如何解决这个问题?
谢谢你。
解决方案
这条线没有做你认为它正在做的事情:
tmp1 = df1[df1.value1 == 'b'].iloc[:, 2:]
方法是按顺序应用的,因此df1[df1.value1 == 'b']
只保留行3, 4, 5
。df1
但这不是您想要的,您想从满足条件的第一个实例开始更新所有行。
相反,首先找到所需的索引。
idx = df1['value1'].eq('b').values.argmax()
然后,您需要显式分配最后n行df2
:
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
推荐阅读
- r - 避免科学记数法x轴ggplot
- algorithm - 使用特定图案平铺三角形网格
- javascript - 使用 angularjs 承诺添加随机数
- java - cassandra使用java驱动读取大量数据
- robotframework - 评估机器人框架中的表达式错误
- excel - 在 Visual Basic 中将文件拆分为数组
- java - 将嵌套对象发送到 Jaspersoft iReport
- rxjs - 有没有办法使用 rxjs switchMap 或类似的,并可选择返回一个 observable
- angular - Angular 5:为什么在调试模式下没有出现“组件是 2 个模块声明的一部分”
- c# - C#动态方法:返回整数的字符串表示