2

我是 pandas 的新用户(截至昨天),发现它有时既方便又令人沮丧。

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

尝试一个具体的例子:

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

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

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

4

2 回答 2

2

fillna通常用于向前或向后进行观察。相反,我会使用np.where... 如果我明白你在问什么。

import numpy as np
np.where(np.isnan(df['newcolumn1']), df['oldcolumn1'], df['newcolumn1'])
于 2013-08-01T16:57:02.893 回答
0

回答你的问题:是的。看看使用valuefillna 的参数。连同to_dict()其他数据帧上的方法。

但要真正解决您的问题,请查看update()DataFrame 的方法。假设您的两个数据框的索引相似,我认为这正是您想要的。

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

请注意,所有的NaNs indf都被替换了,除了(1, A)因为那NaN也在df2. 还有一些值在和(5, B)之间有所不同。通过使用它可以保持价值。dfdf2overwrite=Falsedf

编辑:根据评论,您似乎正在寻找列名在两个 DataFrame 上不匹配的解决方案(如果您发布示例数据会很有帮助)。让我们尝试一下,将 A 列替换为 C,将 B 列替换为 D。

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

我认为如果你花时间学习熊猫,你会遇到更少的挫败感。这是一个巨大的图书馆,所以需要时间。

于 2013-08-01T17:01:31.190 回答