【问题标题】:apply/ map function to prior row将函数应用/映射到前一行
【发布时间】:2016-10-11 20:18:16
【问题描述】:

对函数及其应用仍然很陌生我想为数据框创建一个新列D

 df = pd.DataFrame([[1, 2, 3], [1, 3, 5], [4, 6, 7]], columns=['A', 'B', 'C'])

    A   B   C
 0  1   2   3
 1  1   3   5
 2  4   6   7

D 列及其内容应借助函数创建,我认为是这种方式:

 def my_func(B, C):
     if C > B.shift(1):
         df['D'] = 'right'
     return df['D']
 else:
      df['D'] = 'left'
      return df['D']

简单来说:如果C 中的值高于前一行中B 的值,则单元格将获得“右”,否则为“左”。 我没有让它运行,不知何故不接受轮班或者我收到错误消息

Series 的真值是模棱两可的。使用 a.empty、a.bool()、 a.item()、a.any() 或 a.all()。

欢迎任何关于如何最好地使用此类任务的功能以及应用 shift() 的帮助。

编辑:我正在寻找解决方案的“功能版本”,因为这将是一个经常使用的过程。

【问题讨论】:

    标签: python dictionary pandas dataframe


    【解决方案1】:

    你可以使用numpy.where:

    df['D'] = np.where(df.C > df.B.shift(), 'left', 'right')
    print (df)
       A  B  C      D
    0  1  2  3  right
    1  1  3  5   left
    2  4  6  7   left
    

    如果需要功能:

    def f(B, C):
        df['D'] = np.where(C > B.shift(), 'left', 'right')
        return df
    
    print(f(df.B, df.C))
       A  B  C      D
    0  1  2  3  right
    1  1  3  5   left
    2  4  6  7   left
    

    或者:

    def f(B, C):
        df['D'] = np.where(C > B.shift(), 'left', 'right')
        return df.D
    
    print(f(df.B, df.C))
    0    right
    1     left
    2     left
    Name: D, dtype: object
    

    【讨论】:

    • 我喜欢这个解决方案@jezrael,但是如何在函数中实现它?
    【解决方案2】:

    假设这是一个名为 df 的 pandas 数据框

    A   B
    0   0   
    1   1   
    2   2   
    3   3   
    4   4   
    

    现在假设我将 shift 应用到 B

    会发生什么

    A   B
    0   NaN   
    1   0 
    2   1   
    3   2   
    4   3
    

    所以现在当你尝试比较时,它会弹出一个错误,因为它试图将一个数字与非数字(NaN)的东西进行比较

    所以现在这取决于你想对第一行做什么......

    现在谈谈为什么这个特殊的 sn-p 不起作用。 您要做的是发送一个系列作为参数并比较它们以更新单行.... C > B.shift(1) 请注意,C 和 B 是系列,这就是弹出错误的原因。因此,为避免这种情况,您必须检查每一行的条件并更新 D

    这可以通过

    df['D'] = ['right' if i > j else 'left' for i, j in zip(df.B.shift(), df.C)]
    

    简单吧!?快乐编码!

    【讨论】:

    • 你对我为什么没有走远的解释清楚了很多,@hashcode55。谢谢你。我只需要更好地掌握 zip 函数的实现。我自己永远也不会发现......
    【解决方案3】:

    你也可以:

    df.loc[df.C > df.B.shift(), 'D'] = 'left'
    df.D = df.D.fillna('right')
    
       A  B  C      D
    0  1  2  3  right
    1  1  3  5   left
    2  4  6  7   left
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2021-08-28
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多