【问题标题】:Python pandas, multindex, slicingPython pandas,多索引,切片
【发布时间】:2015-03-16 02:22:27
【问题描述】:

我有一个 pd.DataFrame

       Time    Value  
a   1  1       1      
    2  2       5
    3  5       7
b   1  1       5
    2  2       9
    3  10      11  

我想将Value 列与Time - Time(t-1) 列相乘,并将结果写入Product 列,从b 行开始,但对于每个顶级索引都是分开的。

例如Product('1','b') 应该是(Time('1','b') - Time('1','a')) * Value('1','b')。为此,我需要在 b 行“开始”列Time 的“移位”版本,以便我可以执行df["Product"] = (df["Time"].shifted - df["Time"]) * df["Value"]。结果应如下所示:

       Time    Value   Product 
a   1  1       1       0
    2  2       5       5
    3  5       7       21
b   1  1       5       0
    2  2       9       9
    3  10      11      88

【问题讨论】:

  • 我不明白,在产品中取值 88,我在 Value 列中看到 11,但在 Time 列中的任何地方都看不到 8。跨度>
  • 就像我上面描述的: Product('b','3') = (Time('b','3') - Time('b','2')) * Value( 'b','3') --> 88 = (10-2) * 11

标签: python pandas slice multi-index


【解决方案1】:

嘿,这应该可以满足您的需要。如果我遗漏了什么,请发表评论。

import pandas as pd
import numpy as np

df = pd.DataFrame({'Time':[1,2,5,1,2,10],'Value':[1,5,7,5,9,11]},
    index = [['a','a','a','b','b','b'],[1,2,3,1,2,3]])

def product(x):
    x['Product'] = (x['Time']-x.shift()['Time'])*x['Value']
    return x

df = df.groupby(level =0).apply(product)
df['Product'] = df['Product'].replace(np.nan, 0)
print df

【讨论】:

    【解决方案2】:

    应该这样做:

    >>> time_shifted = df['Time'].groupby(level=0).apply(lambda x: x.shift())
    >>> df['Product'] = ((df.Time - time_shifted)*df.Value).fillna(0)
    >>> df
         Time  Value  Product
    a 1     1      1        0
      2     2      5        5
      3     5      7       21
    b 1     1      5        0
      2     2      9        9
      3    10     11       88
    

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2018-05-20
      • 2018-11-22
      • 2014-10-03
      • 2017-01-16
      • 2019-03-29
      相关资源
      最近更新 更多