熊猫:如果不缺少B列,则用B列替换A列

时间:2018-08-06 03:01:43

标签: python pandas

我有与上一篇帖子类似的问题。如果B不丢失,我想用B替换A中的缺失值。我使用了一个玩具数据集。

#Create sample dataset
import pandas as pd
import numpy as np
np.random.seed(12345)
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
df
df[df < 0] = 'NaN'
print(df)
Obs.     A         B
0        NaN  0.478943
1        NaN       NaN
2    1.96578   1.39341
3  0.0929079  0.281746
4   0.769023   1.24643
5    1.00719       NaN
6   0.274992  0.228913
7    1.35292  0.886429
8        NaN       NaN
9    1.66903       NaN

#Replace NaN in A with B if B is not NaN

df['A'] = np.where(pd.isnull(df['A']) & pd.notnull(df['B']) == 0, df['B']*1, df['A'])
print(df)

obs      A         B
0  0.478943  0.478943
1       NaN       NaN
2   1.39341   1.39341
3  0.281746  0.281746
4   1.24643   1.24643
5       NaN       NaN
6  0.228913  0.228913
7  0.886429  0.886429
8       NaN       NaN
9       NaN       NaN

此代码完成了工作。但是为什么我需要pd.notnull(df ['B'])== 0?如果我写:

pd.notnull(df['B']) 

相反,代码无法正常工作。的输出是:

Obs.     A         B
0        NaN  0.478943
1        NaN       NaN
2    1.96578   1.39341
3  0.0929079  0.281746
4   0.769023   1.24643
5    1.00719       NaN
6   0.274992  0.228913
7    1.35292  0.886429
8        NaN       NaN
9    1.66903       NaN

我试图了解我的逻辑缺陷。任何其他简单的直观代码将不胜感激。

我基本上需要对非常大的数据集(100m obs +)进行此简单操作,因此正在寻找一种快速的方法(就计算机处理时间而言)。预先感谢。

1 个答案:

答案 0 :(得分:0)

'NaN'替换为np.nan,并使用列fillnaA应用于列B

df = df.replace('NaN', np.nan)
df.A.fillna(df.B, inplace=True)

输出:

          A         B
0  0.478943  0.478943
1       NaN       NaN
2  1.965781  1.393406
3  0.092908  0.281746
4  0.769023  1.246435
5  1.007189       NaN
6  0.274992  0.228913
7  1.352917  0.886429
8       NaN       NaN
9  1.669025       NaN