我想计算间隔col1 = 0, col2 = 1
和col1 = 0, col2 = 2
之间的操作,即以下数据帧的col3的最大值和最小值之间的差异:
import pandas as pd
df = pd.DataFrame({'id':['id1','id1','id1','id1','id1','id1','id1','id1','id2','id2','id2','id2','id2','id2']
,'col1':[0,1,0,0,1,1,0,0,1,0,0,1,1,0],'col2':[1,2,2,1,2,2,2,1,2,2,1,2,2,2],'col3':[11,12,13,14,11,22,33,11,12,13,14,11,22,33]})
col1 col2 col3 id
0 0 1 11 id1
1 1 2 12 id1
2 0 2 13 id1
3 0 1 14 id1
4 1 2 11 id1
5 1 2 22 id1
6 0 2 33 id1
7 0 1 11 id2
8 1 2 12 id2
9 0 2 13 id2
10 0 1 14 id2
11 1 2 11 id2
12 1 2 22 id2
13 0 2 33 id2
额外的一些信息:
当col 1为0且col2为1时,这意味着它是a的开头 子集,当col 1为0且col2为2时,这意味着它是a的结尾 如前所述,使用col3值计算操作的子集 说明。
通过id获取间隔0-1和0-2之间的不同计算。通过这种方式,我们可以得到类似的东西:
# desired ouput
pd.DataFrame({'id':['id1','id1','id2','id2'], 'result':[2,22,2,22]})
id result
0 id1 2
1 id1 22
2 id2 2
3 id2 22
如果我们像以前一样读取原始数据库,我们会注意到它在id1中有两个间隔id(0-1和0-2),其中我们需要计算给定间隔中col3的max-min。此外,我们有几个ID,所以最后我们将得到0-1和0-2之间的所有结果以及它们各自的id标签。
答案 0 :(得分:3)
由于您的id
列已经划分了您的群组,因此您甚至无需使用col1
或col2
。
只需在id
列上进行分组,并应用一个lambda函数,该函数可以获取组中最大值和最小值之间的差异。
>>> df.groupby('id')['col3'].apply(lambda group: group.max() - group.min()).reset_index()
id col3
0 id1 2
1 id2 22
答案 1 :(得分:1)
您可以将.groupby
与.apply
:
def diffbetween(df):
start = df[(df.col1 == 0) & (df.col2 == 1)].index[0]
end = df[(df.col1 == 0) & (df.col2 == 2)].index[0]
return df.loc[end].col3 - df.loc[start].col3
print(df.groupby('id').apply(diffbetween).to_frame(name='result').reset_index())
id result
0 id1 2
1 id2 19
这适用于您要查找特定值col1 = 0
,col2 = 1
,col1 = 0
和col2 = 2
的情况。如果这些将永远分别是最小值和最大值(如果不超过它们),那么你应该使用@ Alexander的solution。
import numpy as np
starts = df[(df.col1 == 0) & (df.col2 == 1)].index
ends = df[(df.col1 == 0) & (df.col2 == 2)].index
df2 = pd.DataFrame(columns=['id', 'col3'], index=range(starts.shape[0]))
for i, (start, end) in enumerate(zip(starts, ends)):
df2.iloc[i, 0] = df.iloc[end].id
df2.iloc[i, 1] = np.ptp(df.iloc[start:end+1].col3)
print(df2)
id col3
0 id1 2
1 id1 22