【问题标题】:Iterating over dataframe and replace with values from another dataframe迭代数据帧并用另一个数据帧中的值替换
【发布时间】:2019-12-03 14:02:12
【问题描述】:

我有 2 个数据框,df1 和 df2,df2 保存对应列的最小值和最大值。

    import numpy as np
    import pandas as pd

    df1 = pd.DataFrame(np.random.randint(0,50,size=(10, 5)), columns=list('ABCDE'))
    df2 = pd.DataFrame(np.array([[5,3,4,7,2],[30,20,30,40,50]]),columns=list('ABCDE'))

当 df1 单元格值低于/高于相应列的最小/最大值时,我想遍历 df1 并将单元格值替换为 df2 的值。

【问题讨论】:

    标签: python pandas dataframe replace


    【解决方案1】:

    首先不要loop/iterate in pandas,如果存在其他更好的矢量化解决方案,比如这里。

    将numpy.select 与按条件广播设置值一起使用:

    np.random.seed(123)
    df1 = pd.DataFrame(np.random.randint(0,50,size=(10, 5)), columns=list('ABCDE'))
    df2 = pd.DataFrame(np.array([[5,3,4,7,2],[30,20,30,40,50]]),columns=list('ABCDE'))
    
    print (df1)
        A   B   C   D   E
    0  45   2  28  34  38
    1  17  19  42  22  33
    2  32  49  47   9  32
    3  46  32  47  25  19
    4  14  36  32  16   4
    5  49   3   2  20  39
    6   2  20  47  48   7
    7  41  35  28  38  33
    8  21  30  27  34  33
    
    print (df2)
        A   B   C   D   E
    0   5   3   4   7   2
    1  30  20  30  40  50
    

    #for pandas below 0.24 change .to_numpy() to .values
    min1 = df2.loc[0].to_numpy()
    max1 = df2.loc[1].to_numpy()
    arr = df1.to_numpy()
    
    df = pd.DataFrame(np.select([arr < min1, arr > max1], [min1, max1], arr), 
                      index=df1.index, 
                      columns=df1.columns)
    print (df)
        A   B   C   D   E
    0  30   3  28  34  38
    1  17  19  30  22  33
    2  30  20  30   9  32
    3  30  20  30  25  19
    4  14  20  30  16   4
    5  30   3   4  20  39
    6   5  20  30  40   7
    7  30  20  28  38  33
    8  21  20  27  34  33
    9  12  20   4  40   5
    

    numpy.clip 的另一个更好的解决方案:

    df = pd.DataFrame(np.clip(arr, min1, max1), index=df1.index,  columns=df1.columns)
    print (df)
        A   B   C   D   E
    0  30   3  28  34  38
    1  17  19  30  22  33
    2  30  20  30   9  32
    3  30  20  30  25  19
    4  14  20  30  16   4
    5  30   3   4  20  39
    6   5  20  30  40   7
    7  30  20  28  38  33
    8  21  20  27  34  33
    9  12  20   4  40   5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 2015-12-19
      • 2018-01-23
      • 1970-01-01
      • 2019-08-06
      • 2020-12-08
      • 1970-01-01
      • 2016-11-17
      相关资源
      最近更新 更多