减少列值之间的数据帧

时间:2017-09-13 13:59:06

标签: python dataframe

我想计算间隔col1 = 0, col2 = 1col1 = 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标签。

2 个答案:

答案 0 :(得分:3)

由于您的id列已经划分了您的群组,因此您甚至无需使用col1col2

只需在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 = 0col2 = 1col1 = 0col2 = 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