使用groupby根据列中的值拆分pandas数据框
- 2024-12-03 08:44:00
- admin 原创
- 182
问题描述:
我想根据 ZZ 列拆分以下数据框
df =
N0_YLDF ZZ MAT
0 6.286333 2 11.669069
1 6.317000 6 11.669069
2 6.324889 6 11.516454
3 6.320667 5 11.516454
4 6.325556 5 11.516454
5 6.359000 6 11.516454
6 6.359000 6 11.516454
7 6.361111 7 11.516454
8 6.360778 7 11.516454
9 6.361111 6 11.516454
作为输出,我想要一个新的,将DataFrame
列N0_YLDF
拆分为 4 个,每个唯一值对应一个新列ZZ
。我该怎么做?我可以执行 groupby,但不知道如何处理分组对象。
解决方案 1:
gb = df.groupby('ZZ')
[gb.get_group(x) for x in gb.groups]
解决方案 2:
还有另一种选择,因为 groupby 返回一个生成器,我们可以简单地使用列表推导来检索第二个值(框架)。
dfs = [x for _, x in df.groupby('ZZ')]
解决方案 3:
在 R 中,有一个名为 split 的数据框方法。这适用于所有 R 用户:
def split(df, group):
gb = df.groupby(group)
return [gb.get_group(x) for x in gb.groups]
解决方案 4:
将它们存储在中dict
,这样您就可以根据组键访问组 DataFrames。
d = dict(tuple(df.groupby('ZZ')))
d[6]
# N0_YLDF ZZ MAT
#1 6.317000 6 11.669069
#2 6.324889 6 11.516454
#5 6.359000 6 11.516454
#6 6.359000 6 11.516454
#9 6.361111 6 11.516454
如果您只需要 DataFrame 的一个子集(在本例中只需要'NO_YLDF'
Series),您可以修改字典理解。
d = dict((idx, gp['N0_YLDF']) for idx, gp in df.groupby('ZZ'))
d[6]
#1 6.317000
#2 6.324889
#5 6.359000
#6 6.359000
#9 6.361111
#Name: N0_YLDF, dtype: float64
解决方案 5:
您可以迭代唯一值并使用loc
或获取组query
:
[df.loc[df['ZZ'] == i] for i in df['ZZ'].unique()]
或者
[df.query('ZZ == @i') for i in df['ZZ'].unique()]
解决方案 6:
添加用户 qwwqwwq 的回答:
gb = df.groupby('ZZ')
df_six = gb.get_group("6") #to create another dataframe with ZZ = 6
df_one = gb.get_group("7") #to create another dataframe with ZZ = 7
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD