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

时间:2019-01-04 06:19:38

标签: python-3.x pandas dataframe pandas-groupby

我正在尝试根据列替换列的值。例如, col1 的值位于前5行中,而 col2 的值则可以根据col2更新col1值。

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

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

我使用了Replacing few values in a pandas dataframe column with another value中的此代码行。它给我输出的只是用数据值替换值,而不是用数据值列中的值替换。

数据框

    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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

或者,您也可以使用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