【问题标题】:Row-wise replace operation in pandas dataframe熊猫数据框中的逐行替换操作
【发布时间】:2021-02-02 22:23:30
【问题描述】:

在给定的数据框中,我尝试执行逐行替换操作,其中 1 应替换为 Values 中的值。

输入:

import pandas as pd
df = pd.DataFrame({'ID': [1,1,1,2,3,3,4,5,6,7], 
                   'A': [0,1,0,1,0,0,1,0,np.nan,0],
                   'B': [0,0,0,0,1,1,0,0,0,0],
                   'C': [1,0,1,0,0,0,0,0,1,1],
                   'Values': [10, 2, 3,4,9,3,4,5,2,3]})

预期输出:

   ID   A   B   C   Values
0   1   0.0 0   10  10
1   1   2.0 0   0   2
2   1   0.0 0   3   3
3   2   4.0 0   0   4
4   3   0.0 9   0   9
5   3   0.0 3   0   3
6   4   4.0 0   0   4
7   5   0.0 0   0   5
8   6   NaN 0   2   2
9   7   0.0 0   3   3

**注意:数据非常大。

【问题讨论】:

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


    【解决方案1】:

    使用df.where

     df[['A','B','C']]=df[['A','B','C']].where(df[['A','B','C']].ne(1),df['Values'], axis=0)
    
    
    
    ID    A  B   C  Values
    0   1  0.0  0  10      10
    1   1  2.0  0   0       2
    2   1  0.0  0   3       3
    3   2  4.0  0   0       4
    4   3  0.0  9   0       9
    5   3  0.0  3   0       3
    6   4  4.0  0   0       4
    7   5  0.0  0   0       5
    8   6  NaN  0   2       2
    9   7  0.0  0   3       3
    

    或者

    df[['A','B','C']]=df[['A','B','C']].mask(df[['A','B','C']].eq(1),df['Values'], axis=0)
    

    【讨论】:

    • 我的数据真的很大,很慢。
    【解决方案2】:

    我的数据真的很大,而且很慢。

    如果我们利用您的数据集的性质(A、B、C 列具有 1s0sNans),您只需将多个 df['values'] 与每列独立。这应该是超快的,因为它是矢量化的。

    df['A'] = df['A']*df['Values']
    df['B'] = df['B']*df['Values']
    df['C'] = df['C']*df['Values']
    
    print(df)
    
       ID    A  B   C  Values
    0   1  0.0  0  10      10
    1   1  2.0  0   0       2
    2   1  0.0  0   3       3
    3   2  4.0  0   0       4
    4   3  0.0  9   0       9
    5   3  0.0  3   0       3
    6   4  4.0  0   0       4
    7   5  0.0  0   0       5
    8   6  NaN  0   2       2
    9   7  0.0  0   3       3
    

    如果您想明确检查 A、B、C 的值为 1 的条件(可能是因为这些列的值可能不是 Nans 或 0),那么您可以使用它 -

    df[['A','B','C']] = (df[['A','B','C']] == 1)*df[['Values']].values
    

    这将替换原始数据中的 A、B、C 列,但也会将 Nans 替换为 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      相关资源
      最近更新 更多