pandas按列分组删除

41
我正在进行一个简单的分组操作,试图比较分组均值。如下所示,我从一个较大的数据框中选择了特定的列,其中所有缺失值都已被删除。

selected columns and df head

但是当我进行分组时,一些列在聚合结果中被默默地丢弃了。

group-by logic and resulting df

为什么会这样呢?
我在使用pandas时从未遇到过这种情况,而且在stackoverflow上也没有找到类似的解决方案。有人能提供一些见解吗?
3个回答

43

我认为这是'nuisance'列的自动排除,在这里进行了描述

示例:

df = pd.DataFrame({'C': {0: -0.91985400000000006, 1: -0.042379, 2: 1.2476419999999999, 3: -0.00992, 4: 0.290213, 5: 0.49576700000000001, 6: 0.36294899999999997, 7: 1.548106}, 'A': {0: 'foo', 1: 'bar', 2: 'foo', 3: 'bar', 4: 'foo', 5: 'bar', 6: 'foo', 7: 'foo'}, 'B': {0: 'one', 1: 'one', 2: 'two', 3: 'three', 4: 'two', 5: 'two', 6: 'one', 7: 'three'}, 'D': {0: -1.131345, 1: -0.089328999999999992, 2: 0.33786300000000002, 3: -0.94586700000000001, 4: -0.93213199999999996, 5: 1.9560299999999999, 6: 0.017587000000000002, 7: -0.016691999999999999}})
print (df)
     A      B         C         D
0  foo    one -0.919854 -1.131345
1  bar    one -0.042379 -0.089329
2  foo    two  1.247642  0.337863
3  bar  three -0.009920 -0.945867
4  foo    two  0.290213 -0.932132
5  bar    two  0.495767  1.956030
6  foo    one  0.362949  0.017587
7  foo  three  1.548106 -0.016692

print( df.groupby('A').mean())
            C         D
A                      
bar  0.147823  0.306945
foo  0.505811 -0.344944

我认为你可以查看DataFrame.dtypes


3
你认为 df.groupby('A', as_index=False).mean() 或者 df.groupby('A').mean().reset_index() 哪一个更好? - jezrael
1
搞定了!谢谢。 - spacedustpi
1
确实,那样做会更容易。我最终使用了 df.mycols.fillna('')、分组,然后 df.problem_col.replace('^;|;$','') - Sos
啊,我在一个 CSV 文件中有一个字符深度,所以 Pandas “自然地”决定默默地无法计算该列的 .sum(),而只是删除了该列。我很惊讶这是默认行为。 - Tunneller
Pandas 不支持在 object 类型的列上执行数值分组操作。您可以使用 DataFrame.dtypes 检查列的数据类型。从 SQL 数据库提取数据时,有时空值会作为 None 存在,因此您需要使用 df.fillna(np.nan) 或等效代码将 None 值替换为 np.nan - Foggy
显示剩余7条评论

13
尝试使用df.groupby(['col_1','col_2'],as_index=False).mean()。 使用as_index=False保留列名。默认为True。上面的评论已经回答了这个问题,但将其发布为答案。

5
请确保你的列以数字/整数格式而不是 Object 格式(例如'O')存在。这是其中一个让我产生问题的原因。
您可以使用以下代码检查列的格式:
df.column.dtypes

1
这里的代码是不正确的。正确的代码是 df.dtypes - Foggy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接