开发者问题收集

根据 Pandas 中其他列的相应值替换列值

2019-01-04
975

我正在尝试根据列替换列的值。例如 col1 在前 5 行中有值,而 col2 中有值,因此根据 col2 更新 col1 值。

接下来的五行,col1 中没有值,但 col2 有值,只需跳过这些行,不需要更新 col1,依此类推。

df9["col1"].replace(["s1"], "data_value", inplace=True)

我使用了 用另一个值替换 pandas dataframe 列中的几个值 中的这行代码。它给我的输出只是用数据值替换值,而不是用数据值列内的值替换。

数据框

    col1    col2    col3    col4
0   s1        NaN    NaN     NaN
1   s1        NaN    NaN     NaN
2   s1        NaN    NaN     NaN
3   s1       NaN    NaN     NaN
4   s1       NaN    NaN     NaN
5   NaN       s2    NaN     NaN
6   NaN       s2     NaN     NaN
7   NaN       s2    NaN     NaN
8   NaN       s2    NaN     NaN
9   NaN       s2    NaN     NaN
10  NaN      NaN    ss1     NaN
11  NaN      NaN    ss1     NaN
12  NaN      NaN    ss1     NaN
13  NaN      NaN    ss1     NaN
14  NaN      NaN    ss1     NaN
15  NaN      NaN    NaN     ss333
16  NaN      NaN    NaN     ss333
17  NaN      NaN    NaN     ss333
18  NaN      NaN    NaN     ss333
19  NaN      NaN    NaN     ss333

所需输出:

    col1    col2    col3    col4
0   0        NaN    NaN     NaN
1   0        NaN    NaN     NaN
2   0        NaN    NaN     NaN
3   0        NaN    NaN     NaN
4   0        NaN    NaN     NaN
5   NaN       0     NaN     NaN
6   NaN       0     NaN     NaN
7   NaN       0     NaN     NaN
8   NaN       0     NaN     NaN
9   NaN       0     NaN     NaN
10  NaN      NaN    500     NaN
11  NaN      NaN    500     NaN
12  NaN      NaN    500     NaN
13  NaN      NaN    500     NaN
14  NaN      NaN    500     NaN
15  NaN      NaN    NaN     500
16  NaN      NaN    NaN     500
17  NaN      NaN    NaN     500
18  NaN      NaN    NaN     500
19  NaN      NaN    NaN     500
2个回答

使用 mask 将所有未缺失值替换为 pop 以提取列 Data :

df = pd.DataFrame({
         'A':[4,5] + [np.nan] * 4,
         'B':[np.nan,np.nan,9,4,np.nan,np.nan],
         'C':[np.nan] * 4 + [7,0],
         'Data':list('aaabbb')
})

print (df)
     A    B    C Data
0  4.0  NaN  NaN    a
1  5.0  NaN  NaN    a
2  NaN  9.0  NaN    a
3  NaN  4.0  NaN    b
4  NaN  NaN  7.0    b
5  NaN  NaN  0.0    b

df = df.mask(df.notnull(), df.pop('Data'), axis=0)
print (df)
     A    B    C
0    a  NaN  NaN
1    a  NaN  NaN
2  NaN    a  NaN
3  NaN    b  NaN
4  NaN  NaN    b
5  NaN  NaN    b
jezrael
2019-01-04

或者,您也可以使用 where

df = pd.DataFrame({'col1': ['s1']*5+[np.nan]*15,
                  'col2':[np.nan]*5+['s2']*5+[np.nan]*10,
                  'col3':[np.nan]*10+['ss1']*5+[np.nan]*5,
                  'col4':[np.nan]*15+['ss333']*5,
                  'data_value':[0]*10+[500]*10 })

df = df.where(df.isnull(), df.pop('data_value'), axis = 0)

    col1    col2    col3    col4
0   0        NaN    NaN     NaN
1   0        NaN    NaN     NaN
2   0        NaN    NaN     NaN
3   0        NaN    NaN     NaN
4   0        NaN    NaN     NaN
5   NaN       0     NaN     NaN
6   NaN       0     NaN     NaN
7   NaN       0     NaN     NaN
8   NaN       0     NaN     NaN
9   NaN       0     NaN     NaN
10  NaN      NaN    500     NaN
11  NaN      NaN    500     NaN
12  NaN      NaN    500     NaN
13  NaN      NaN    500     NaN
14  NaN      NaN    500     NaN
15  NaN      NaN    NaN     500
16  NaN      NaN    NaN     500
17  NaN      NaN    NaN     500
18  NaN      NaN    NaN     500
19  NaN      NaN    NaN     500
Mohit Motwani
2019-01-04