对 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
.
的一个不存在的列
希望对您有所帮助!
我有这个 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
.
希望对您有所帮助!