Python pandas,多索引,切片
Python pandas, multindex, slicing
我有一个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')
。为此,我需要一个 "shifted" 版本的列 Time
"starting" 在行 b 以便我可以做 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
应该这样做:
>>> 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
嘿,这应该可以满足您的需求。如果我遗漏了什么,请评论。
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
我有一个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')
。为此,我需要一个 "shifted" 版本的列 Time
"starting" 在行 b 以便我可以做 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
应该这样做:
>>> 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
嘿,这应该可以满足您的需求。如果我遗漏了什么,请评论。
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