在多列上使用pandas fillna()

时间:2013-08-01 16:50:21

标签: python pandas

我是一个新的熊猫用户(截至昨天),并且有时发现它既方便又令人沮丧。

我目前的挫败感是尝试在数据帧的多个列上使用df.fillna()。例如,我有两组部分重叠的数据(较新的集合和较旧的集合)。对于我们有新数据的情况,我只是使用它,但如果没有更新的数据,我也想使用旧数据。看来我应该能够使用fillna()来填充较旧的列,但是我无法让它工作。

尝试一个具体的例子:

df.ix[:,['newcolumn1','newcolumn2']].fillna(df.ix[:,['oldcolumn1','oldcolumn2']], inplace=True)

但是这没有按预期工作 - 数字显示在新的列中,这些列是NaN,但不是旧列中的数据(实际上,查看数据,我不知道数字在哪里它选择来自,因为它们在新旧数据中都不存在。)

有没有办法用DataFrame的其他特定列中的vales填充DataFrame中特定列的NaN?

2 个答案:

答案 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)。此外,dfdf2之间的某些值(例如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}}

我认为如果你花时间去学习大熊猫,你会减少挫折的时刻。这是一个庞大的图书馆,所以需要时间。