代码之家  ›  专栏  ›  技术社区  ›  Devesh Agrawal

如何在pandas python中转换列中的行并执行操作

  •  1
  • Devesh Agrawal  · 技术社区  · 6 年前

    我有一个这样的熊猫数据框。

    Date    Strike_price        value           
    1/1/18      10000           55
    1/1/18      10100           40
    1/1/18      10200           37
    1/1/18      10300           25  
    2/1/18      10000           52
    2/1/18      10100           38
    2/1/18      10200           33
    2/1/18      10300           21
    3/1/18      10000           58
    3/1/18      10100           43
    3/1/18      10200           39
    3/1/18      10300           26  
    

    我想从这样的数据框中创建一个新的数据框:

    1/1/18      27 # 27 == 55 - 40 + 37 - 25
    2/1/18      26
    3/1/18      28
    

    我试着用 df.pivot_table('value', ['Date'], 'Strike_Price') ,它将执行价格转换为列,但我无法从df中删除或筛选出任何特定列。

    有人能帮我吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   timgeb    6 年前

    鉴于

    >>> df
          Date  Strike_price  value
    0   1/1/18         10000     55
    1   1/1/18         10100     40
    2   1/1/18         10200     37
    3   1/1/18         10300     25
    4   2/1/18         10000     52
    5   2/1/18         10100     38
    6   2/1/18         10200     33
    7   2/1/18         10300     21
    8   3/1/18         10000     58
    9   3/1/18         10100     43
    10  3/1/18         10200     39
    11  3/1/18         10300     26
    

    你可以发布

    >>> df.groupby('Date')['value'].agg(lambda s: s[::2].sum() - s[1::2].sum())
    Date
    1/1/18    27
    2/1/18    26
    3/1/18    28
    Name: value, dtype: int64
    

    或者,您可能更喜欢

    >>> df.groupby('Date', as_index=False)['value'].agg(lambda s: s[::2].sum() - s[1::2].sum())
         Date  value
    0  1/1/18     27
    1  2/1/18     26
    2  3/1/18     28
    
        2
  •  -1
  •   n3utrino    6 年前

    一种解决方案是将“值”的奇数行乘以-1:

    df.value.iloc[1::2] *= -1
    

    然后进行GroupBy和Sum:

    df.groupby('Date').sum()
    

    这对我有用。如果不想修改原始的“值”列,可以创建一个新列,对其进行操作,然后可以选择在末尾删除该列。