我是一个新的熊猫用户(截至昨天),并且有时发现它既方便又令人沮丧。
我目前的挫败感是尝试在数据帧的多个列上使用df.fillna()。例如,我有两组部分重叠的数据(较新的集合和较旧的集合)。对于我们有新数据的情况,我只是使用它,但如果没有更新的数据,我也想使用旧数据。看来我应该能够使用fillna()来填充较旧的列,但是我无法让它工作。
尝试一个具体的例子:
df.ix[:,['newcolumn1','newcolumn2']].fillna(df.ix[:,['oldcolumn1','oldcolumn2']], inplace=True)
但是这没有按预期工作 - 数字显示在新的列中,这些列是NaN,但不是旧列中的数据(实际上,查看数据,我不知道数字在哪里它选择来自,因为它们在新旧数据中都不存在。)
有没有办法用DataFrame的其他特定列中的vales填充DataFrame中特定列的NaN?
答案 0 :(得分:2)
fillna
通常用于向前或向后进行观察。相反,我会使用np.where
...如果我明白你在问什么。
import numpy as np
np.where(np.isnan(df['newcolumn1']), df['oldcolumn1'], df['newcolumn1'])
答案 1 :(得分:0)
回答你的问题:是的。看看使用fillna的value
参数。与其他数据框上的to_dict()
方法一起使用。
但要真正解决您的问题,请查看DataFrame的update()
方法。假设您的两个数据帧具有相似的索引,我认为这正是您想要的。
In [36]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})
In [37]: df
Out[37]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 NaN
4 NaN NaN
5 5 1
In [38]: df2 = pd.DataFrame({'A': [0, np.nan, 2, 3, 4, 5], 'B': [1, 0, 1, 1, 0, 0]})
In [40]: df2
Out[40]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 1
4 4 0
5 5 0
In [52]: df.update(df2, overwrite=False)
In [53]: df
Out[53]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 1
4 4 0
5 5 1
请注意NaN
中的所有df
都已被替换,(1, A)
除外,因为NaN
中的df2
也是(5, B)
。此外,df
和df2
之间的某些值(例如overwrite=False
)也有所不同。通过使用df
,它可以保留In [33]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})
In [34]: df2 = pd.DataFrame({'C': [0, np.nan, 2, 3, 4, 5], 'D': [1, 0, 1, 1, 0, 0]})
In [35]: df
Out[35]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 NaN
4 NaN NaN
5 5 1
In [36]: df2
Out[36]:
C D
0 0 1
1 NaN 0
2 2 1
3 3 1
4 4 0
5 5 0
In [37]: d = {'A': df2.C, 'B': df2.D} # pass this values in fillna
In [38]: df
Out[38]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 NaN
4 NaN NaN
5 5 1
In [40]: df.fillna(value=d)
Out[40]:
A B
0 0 1
1 NaN 0
2 2 1
3 3 1
4 4 0
5 5 1
的值。
编辑:基于评论,您似乎在寻找一个解决方案,其中列名称与两个数据框架不匹配(如果您发布样本数据,则会有所帮助)。让我们试试,用C代替A和B的A列。
{{1}}
我认为如果你花时间去学习大熊猫,你会减少挫折的时刻。这是一个庞大的图书馆,所以需要时间。