说我有以下熊猫数据框:
df = pd.DataFrame([[3, 2, np.nan, 0],
[5, 4, 2, np.nan],
[7, np.nan, np.nan, 5],
[9, 3, np.nan, 4]],
columns=list('ABCD'))
返回以下内容:
A B C D
0 3 2.0 NaN 0.0
1 5 4.0 2.0 NaN
2 7 NaN NaN 5.0
3 9 3.0 NaN 4.0
我希望如果找到np.nan,那么该值将被A列中的值替换。因此,结果将是这样:
A B C D
0 3 2.0 3.0 0.0
1 5 4.0 2.0 5.0
2 7 7.0 7.0 5.0
3 9 3.0 9.0 4.0
我已经尝试了多种方法,但是我什么都无法工作。有人可以帮忙吗?
答案 0 :(得分:6)
这里有必要进行两次移调:
cols = ['B','C', 'D']
df[cols] = df[cols].T.fillna(df['A']).T
print(df)
A B C D
0 3 2.0 3.0 0.0
1 5 4.0 2.0 5.0
2 7 7.0 7.0 5.0
3 9 3.0 9.0 4.0
因为:
df[cols] = df[cols].fillna(df['A'], axis=1)
print(df)
NotImplementedError:当前只能用dict / Series逐列填充
具有numpy.where
和广播列A
的另一种解决方案:
df = pd.DataFrame(np.where(df.isnull(), df['A'].values[:, None], df),
index=df.index,
columns=df.columns)
print (df)
A B C D
0 3.0 2.0 3.0 0.0
1 5.0 4.0 2.0 5.0
2 7.0 7.0 7.0 5.0
3 9.0 3.0 9.0 4.0
感谢@pir提供另一种解决方案:
df = pd.DataFrame(np.where(df.isnull(), df[['A']], df),
index=df.index,
columns=df.columns)
答案 1 :(得分:5)
当前,+------------------------------+---------------------------------------------------+
| Items | depends on |
+------------------------------+---------------------------------------------------+
| Get 2 slices of bread | |
| Put peanut butter on 1 slice | Get 2 slices of bread |
| Put jelly on 1 slice | Get 2 slices of bread |
| Put away peanut butter jar | Put peanut butter on 1 slice |
| Put slices together | Put peanut butter on 1 slice,Put jelly on 1 slice |
| Put away jelly jar | Put jelly on 1 slice |
+------------------------------+---------------------------------------------------+
不允许在对齐索引时跨列广播系列。
fillna
此功能完全类似于我们希望pandas.DataFrame.mask
执行的操作。查找空值,并沿fillna
的{{1}}填充
df.A
axis=0
使用字典但是,您可以将字典传递给df.mask(df.isna(), df.A, axis=0)
A B C D
0 3 2.0 3.0 0.0
1 5 4.0 2.0 5.0
2 7 7.0 7.0 5.0
3 9 3.0 9.0 4.0
,告诉字典该如何处理每一列。
pandas.DataFrame.fillna
答案 2 :(得分:3)
用fillna
来reindex
df.fillna(df[['A']].reindex(columns=df.columns).ffill(1))
Out[20]:
A B C D
0 3 2.0 3.0 0.0
1 5 4.0 2.0 5.0
2 7 7.0 7.0 5.0
3 9 3.0 9.0 4.0
或combine_first
df.combine_first(df.fillna(0).add(df.A,0))
Out[35]:
A B C D
0 3 2.0 3.0 0.0
1 5 4.0 2.0 5.0
2 7 7.0 7.0 5.0
3 9 3.0 9.0 4.0
答案 3 :(得分:0)
# for each column...
for col in df.columns:
# I select the np.nan and I replace then with the value of A
df.loc[df[col].isnull(), col] = df["A"]