对 pandas 中的数据帧使用 groupby() 导致索引错误

Using groupby() for a dataframe in pandas resulted Index Error

我有这个 dataframe:

      x        y        z        parameter     
0     26       24       25       Age
1     35       37       36       Age  
2     57       52       54.5     Age
3     160      164      162      Hgt           
4     182      163      172.5    Hgt             
5     175      167      171      Hgt              
6     95       71       83       Wgt     
7     110      68       89       Wgt     
8     89       65       77       Wgt 

我正在使用 pandas 得到这个 最终结果:

      x        y        parameter     
0     160      164      Hgt           
1     182      163      Hgt             
2     175      167      Hgt 

我正在使用 groupby() 根据相同参数 Hgt 从原始 dataframe

中提取和隔离行

首先,我添加了一列以将其设置为 index:

df = df.insert(0,'index', [count for count in range(df.shape[0])], True)

dataframe 结果是这样的:

      index    x        y        z        parameter     
0     0        26       24       25       Age
1     1        35       37       36       Age  
2     2        57       52       54.5     Age
3     3        160      164      162      Hgt           
4     4        182      163      172.5    Hgt             
5     5        175      167      171      Hgt              
6     6        95       71       83       Wgt     
7     7        110      68       89       Wgt     
8     8        89       65       77       Wgt 

然后,我使用下面的代码基于index分组并提取我需要的列:

df1 = df.groupby('index')[['x', 'y','parameter']]

输出为:

      x        y        parameter     
0     26       24       Age
1     35       37       Age  
2     57       52       Age
3     160      164      Hgt           
4     182      163      Hgt             
5     175      167      Hgt              
6     95       71       Wgt     
7     110      68       Wgt     
8     89       65       Wgt   

之后,我使用以下代码仅隔离了 Hgt 值:

df2 = df1[df1['parameter'] == 'Hgt']

当我 运行 df2 时,我收到一条错误消息:

IndexError: Column(s) ['x', 'y', 'parameter'] already selected

我是不是漏掉了什么?如何获得最终结果

你真的需要groupby吗?

>>> df.loc[df['parameter'] == 'Hgt', ['x', 'y', 'parameter']].reset_index(drop=True)
     x    y parameter
0  160  164       Hgt
1  182  163       Hgt
2  175  167       Hgt

因为你问的是哪里做错了,让我指向useless/bad代码。

没有任何判断(这只是为了帮助你改进以后的代码),几乎所有的东西都是不正确的。感觉就像是用一系列复杂的方法来做无用的事情。让我说一些细节:

df = df.insert(0,'index', [count for count in range(df.shape[0])], True)

这似乎是一种非常复杂的做法 df.reset_index()。甚至 [count for count in range(df.shape[0])] 也可以通过直接使用 range(df.shape[0]) 来简化。

但是 groupby 甚至不需要此步骤,因为您可以按索引级别分组:

df.groupby(level=0)

但是...groupby 无论如何都没用,因为您只有一个成员组。

此外,当您这样做时:

df1 = df.groupby('index')[['x', 'y','parameter']]

df1 不是 数据框,而是 DataFrameGroupBy 对象。当您知道自己在做什么时,将其存储在变量中非常有用,但是这会导致您的情况发生错误,因为您认为这是 DataFrame。您需要应用 DataFrameGroupBy 对象的聚合或转换方法来取回 DataFrame,而您没有这样做(可能是因为,如上所示,对单个-成员团体)。

所以当你 运行:

df1[df1['parameter'] == 'Hgt']

同样,一切都是错误的,因为 df1['parameter'] 等同于 df.groupby('index')[['x', 'y','parameter']]['parameter'](错误的原因是你 select 两次 'parameter')。即使您删除了此错误,相等性比较也会给出一个 True/False,因为您仍然有 DataFrameGroupBy 而不是 DataFrame,这会错误地尝试subselect DataFrameGroupBy.

的一个不存在的列

希望对您有所帮助!