Python 减少列值之间的数据帧

Python 减少列值之间的数据帧,python,dataframe,Python,Dataframe,我想计算间隔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,

我想计算间隔
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为0,col2为1时,这意味着这是一个 子集,当col1为0,col2为2时,这意味着这是一个 使用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标签。

由于您的
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

由于您的
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
回答你原来的问题: 您可以将
.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
col2=2如果这些值始终分别为最小值和最大值(如果不会超过),则应使用@Alexander's

回答你的新问题: 回答你原来的问题: 您可以将
.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
col2=2如果这些值始终分别为最小值和最大值(如果不会超过),则应使用@Alexander's

回答你的新问题:
如果最大值是33(第6行),最小值是11(第4行),那么第3-6行不算一个区块吗?结果是22对19,如上图所示?@Brad Solomon,问题部分有效,我用最简单的方式编辑了问题。如果最大值是33(第6行),最小值是11(第4行),那么第3-6行不算一个区块吗,结果是上面显示的22对19?@Brad Solomon,问题部分有效,我以最简单的方式编辑了问题。在组中选择
id
列值的逻辑是什么?我现在需要运行,但今天晚些时候将再次查看。原始数据集将有更多id,因此我想计算不同id之间和同一id内部的所有块的操作。在这种情况下,我只给出了一个id。因为这是主要问题,但每个组都有多个
id
值。是否应该假设给定块中的所有值都相同(例如,仅使用第一个)?或者一个给定的块可能有多个值,在这种情况下如何选择?一个id有几对(0,1)作为起始,0,2作为结束,其中我们必须计算每个块(0,1--0,2)中的最大值和最小值之间的差,并对其id进行签名。最后,我们会得到类似于:id1 id1 id1 id2 id2 id2。。。idn及其值(块值)。在组中选择
id
列值的逻辑是什么?我现在需要运行,但今天晚些时候将再次查看。原始数据集将有更多id,因此我想计算不同id之间和同一id内部的所有块的操作。在这种情况下,我只给出了一个id。因为这是主要问题,但每个组都有多个
id
值。是否应该假设给定块中的所有值都相同(例如,仅使用第一个)?或者一个给定的块可能有多个值,在这种情况下如何选择?一个id有几对(0,1)作为起始,0,2作为结束,其中我们必须计算每个块(0,1--0,2)中的最大值和最小值之间的差,并对其id进行签名。最后,我们会得到类似于:id1 id1 id1 id2 id2 id2。。。idn及其值(块值)。@PeCaDe这是您要查找的输出吗?如果没有,只需确保在问题中准确指定您想要的结果。@PeCaDe这是您要查找的输出吗?如果没有,只需确保在问题中明确指定您想要的结果。