Pandas - 将分组的数据框存储为数据框,而不进行聚合

3

我是Pandas的新手,已经阅读了很多文档、帖子和答案,但是我无法确定一个好的策略来实现我的目标,如果已经有人回答过了,对不起,我找不到。这是我的情况:

df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
df = pd.DataFrame(df)
df
   key  value
0   A   2
1   B   2
2   A   1
3   B   1

我知道使用groupby()会返回一个分组对象,我也知道可以使用分组对象进行许多聚合操作(如计数、大小、平均值等)。然而,我不想进行聚合操作,我只想根据“key”列对数据框进行分组,并将其存储为以下数据框:

   key  value
0   A   2
1   A   1
2   B   2
3   B   1

完成这一步后,我最终想要的是按以下方式对每个组进行排序:

   key  value
0   A   1
1   A   2
2   B   1
3   B   2

非常感谢您的回答、评论或提示。谢谢!

一个 groupby 对象只是描述如何执行分组的元数据,它不是一个 df,在对 groupby 对象执行某种聚合时返回一个 series 或 df。尝试存储这个对象是没有意义的。 - EdChum
好的,我在我的问题中提到groupby是一个对象,那么有什么提示或解决方案吗?因为下面建议的排序不是我要找的。我想保留表中行出现的顺序,而sort严格按字符串顺序对它们进行排序。 - Fred
3个回答

10

您可以通过使用sort_values对数据框进行排序,而不是使用groupby来获得所需的输出。

df.sort_values(['key', 'value'], inplace=True)

编辑:

如果您确实想使用groupby来执行键的分组,那么可以对groupby对象应用一个微不足道的filter筛选器。

df = df.groupby('key').filter(lambda x: True)

这似乎不是获取数据框的最佳方法,但没有其他方法立即出现。之后,您仍需要使用 sort_values 来按值列排序。


谢谢您的回答,但我想使用groupby的原因是:1- 我想找出是否有一种使用groupby的方法。2- 使用sort并不完全符合我的要求,因为它基于字符串(字母)或数字(值)进行排序,对吗?相反,我想按键分组,无论它们在字母表中的位置如何,以及/或数字,而是它们在表中的出现次数。 - Fred
我已经编辑了我的答案,包括使用 groupby 方法的内容。 - root
3
谢谢@root!但是好像没起作用,我在执行你编辑的那行代码后,数据框(df)没有发生变化,或者我漏掉了什么步骤? - Fred

1
如果你愿意不使用链式写法,那么这个方法应该可以解决问题...
df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
df = pd.DataFrame(df)

groups = df.groupby(['key', 'value'])
groups = sorted(groups)
df = pd.concat([g for _, g in groups])

print(df)

就记录而言,我不完全理解为什么您不会对整个框架进行排序... 我猜想您需要分组进行其他转换,除了排序之外,因此您希望节省对整个框架进行排序的时间。如果您通过这样做找到了更好的性能,请告诉我 :)


1
如果您想使用groupby的原因是为了保留索引结构,那么可以按照以下方式操作:
df = {'key': ['A', 'B', 'A', 'B'], 'value': [2,2,1,1]}
df = pd.DataFrame(df)
print(df) 

key  value
0   A      2
1   B      2
2   A      1
3   B      1

所以,首先创建索引:
df.set_index(['key'], inplace=True)
print(df)

     value
key       
A        2
B        2
A        1
B        1

然后,对索引进行排序:
df.sort_index(inplace=True)
print(df)

     value
key       
A        2
A        1
B        2
B        1

然后,对值进行排序:

df.sort_values('value',inplace=True)
print(df)

     value
key       
A        1
B        1
A        2
B        2

如果你想保留原始索引,最后执行以下操作:

df.reset_index(inplace=True)
print(df)

  key  value
0   A      1
1   B      1
2   A      2
3   B      2

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