我有与上一篇帖子类似的问题。如果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 +)进行此简单操作,因此正在寻找一种快速的方法(就计算机处理时间而言)。预先感谢。
答案 0 :(得分:0)
将'NaN'
替换为np.nan
,并使用列fillna
将A
应用于列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