【问题标题】:Replace column values according to corresponding values of other column in Pandas根据 Pandas 中其他列的对应值替换列值
【发布时间】:2019-01-04 20:52:50
【问题描述】:

我正在尝试根据列替换列的值。例如 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

【问题讨论】:

  • 请将您的数据框添加到问题中,而不是作为图像或链接。

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


【解决方案1】:

使用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

【讨论】:

  • @MohitMotwani - 当然,这只是我的解决方案。
  • @jezrael @ Mohit Motwani 感谢我的这种方法解决了我的问题
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 2021-02-20
    • 2020-05-29
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多