Pandas:将匹配模式的每一列中的每个值替换为该行中另一列的值

时间:2018-04-11 07:16:34

标签: pandas

我有一个包含1000列的数据框。我希望将每一列中的每个-9值替换为该行的df [' a']值。

df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, -9, 8, np.nan, -9], 'c': [-9, 19, -9, -9, -9]})

我想要的是

df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, 2, 8, np.nan, 5], 'c': [1, 19, 3, 4, 5]})

我试过了

df.replace(-9, df['a'], inplace = True)

df.replace(-9, np.nan, inplace = True)
df.fillna(df.a, inplace = True)

但是他们不会改变df。

我现在的解决方案是使用for循环:

df.replace(-9, np.nan, inplace = True)
col_list = list(df)
for i in col_list:
   df[i].fillna(df['a'], inplace = True)

此解决方案有效,但它也会替换任何np.nan值。关于如何在不首先将其转换为np.nan的情况下替换-9值的任何想法?谢谢。

2 个答案:

答案 0 :(得分:1)

我认为需要mask

df = df.mask(df == -9, df['a'], axis=0)
print (df)
   a    b   c
0  1  6.0   1
1  2  2.0  19
2  3  8.0   3
3  4  NaN   4
4  5  5.0   5

或者:

df = pd.DataFrame(np.where(df == -9, df['a'].values[:, None], df), columns=df.columns)
print (df)
     a    b     c
0  1.0  6.0   1.0
1  2.0  2.0  19.0
2  3.0  8.0   3.0
3  4.0  NaN   4.0
4  5.0  5.0   5.0

答案 1 :(得分:0)

你也可以做这样的事情

import numpy as np
import pandas as pd

df_tar = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, 2, 8, np.nan, 5], 'c': [1, 19, 3, 4, 5]})


df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [6, -9, 8, np.nan, -9], 'c': [-9, 19, -9, -9, -9]})
df.loc[df['b']==-9,'b']=df.loc[df['b']==-9,'a']
df.loc[df['c']==-9,'c']=df.loc[df['c']==-9,'a']