【问题标题】:How to subtract row values in reference to the associated columns in pandas如何参考熊猫中的关联列减去行值
【发布时间】:2017-04-10 06:51:57
【问题描述】:

我想参考其他列中的值减去行中的连续值。

数据框如下所示:

     A        B    
1   "Sat"     7  
2   "Sat"     9
3   "Sat"     5
4   "Sun"     8  
5   "Sun"     4
6   "Sun"     6

我想参考 A 列减去 B 列的连续值,输出应该是这样的:

     A        B    
1   "Sat"     0  
2   "Sat"    +2
3   "Sat"    -4
4   "Sun"     0  
5   "Sun"    -4
6   "Sun"     2

我一直在使用df.diff() 在整个数据框中完成此操作,但在这里它就像 (key, value) 带有来自 A 列的键和来自 B 列的几个值。只要 A 列中的键是“Sat”,我想减去 B 列中的值,并且当它遇到 A 列中的第二个键“Sun”时应该重新开始减法。

对解决这个问题有帮助吗?

【问题讨论】:

    标签: python pandas dataframe subtraction


    【解决方案1】:

    如果需要,首先按sort_valuesA,然后使用groupbydiff,替换NaN fillna

    df['B'] = df.sort_values('A').groupby('A')['B'].diff().fillna(0)
    print (df)
         A    B
    1  Sat  0.0
    2  Sat  2.0
    3  Sat -4.0
    4  Sun  0.0
    5  Sun -4.0
    6  Sun  2.0
    

    如果需要转换为int:

    df['B'] = df.sort_values('A').groupby('A')['B'].diff().fillna(0).astype(int)
    print (df)
         A  B
    1  Sat  0
    2  Sat  2
    3  Sat -4
    4  Sun  0
    5  Sun -4
    6  Sun  2
    

    使用diff 的另一种解决方案,如果mask 不等于shifted 列A ne,则添加0

    df['B'] = df.B.diff().mask(df.A.ne(df.A.shift()), 0)
    print (df)
         A    B
    1  Sat  0.0
    2  Sat  2.0
    3  Sat -4.0
    4  Sun  0.0
    5  Sun -4.0
    6  Sun  2.0
    

    【讨论】:

      【解决方案2】:

      假设'A' 列中的组总是在一起

      a, b = df.A.values, df.B.values
      np.append(0, np.where(a[:-1] == a[1:], np.diff(b), 0))
      
      array([ 0,  2, -4,  0, -4,  2])
      

      我们可以用

      覆盖我们的列'B'
      a, b = df.A.values, df.B.values
      df.assign(B=np.append(0, np.where(a[:-1] == a[1:], np.diff(b), 0)))
      
           A  B
      1  Sat  0
      2  Sat  2
      3  Sat -4
      4  Sun  0
      5  Sun -4
      6  Sun  2
      

      或者我们可以严格遵守pandas

      df.assign(B=df.B.diff().where(df.A == df.A.shift(), 0).astype(int))
      
           A  B
      1  Sat  0
      2  Sat  2
      3  Sat -4
      4  Sun  0
      5  Sun -4
      6  Sun  2
      

      时机
      小数据

      更大的数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2015-07-27
        • 2021-10-22
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多