gpt4 book ai didi

python - 按列值和行值对数据进行分组

转载 作者:行者123 更新时间:2023-11-28 20:38:14 27 4
gpt4 key购买 nike

我有以下数据框 df :

df =

REGION GROUP_1 GROUP_2 GROUP_3
Reg1 AAA BBB AAA
Reg2 BBB AAA CCC
Reg1 BBB CCC CCC

我需要计算 GROUP_1 值的唯一出现次数, GROUP_2GROUP_3REGION 分组(在我的真实数据集中,GROUP_ 列的数量是 50)。

对于上面的例子,结果应该是这样的:

result = 

REGION COUNT_AAA COUNT_BBB COUNT_CCC
Reg1 1 2 1
Reg2 1 1 1

这是我的代码:

df = (pd.melt(df, id_vars=['REGION'], value_name='GROUP')
.drop('variable', axis=1).drop_duplicates()
.groupby(['REGION', 'GROUP']).agg({'GROUP' : 'count'})
.reset_index())

问题是 1Gb 的数据需要太多时间。由于计算时间很长,我什至无法检查整个数据集的结果。在我看来,代码有问题或者可以简化。

最佳答案

您可以从删除 GROUP_X 中存在的重复值开始列。然后在lreshape的帮助下, 将这些合并成一个 GROUP专栏。

执行 groupby通过将 REGION 作为分组键并计算 value_countsGROUP 列中获取各自的唯一计数。

最后,unstack将多索引系列制作成数据框,并为获得的列标题添加可选前缀。

缓慢的方法:

(pd.lreshape(df.apply(lambda x: x.drop_duplicates(), 1), 
{"GROUP": df.filter(like='GROUP').columns})
.groupby('REGION')['GROUP'].value_counts().unstack().add_prefix('COUNT_'))

enter image description here

获得单位DF :

(pd.lreshape(df.apply(lambda x: x.drop_duplicates(), 1), 
{"GROUP": df.filter(like='GROUP').columns}).groupby('REGION')['GROUP'].value_counts()
.unstack().add_prefix('COUNT_').rename_axis(None, 1).reset_index())

enter image description here


稍微快一点的方法:

MultiIndex.from_arrays的帮助下,我们也可以计算唯一行。

midx = pd.MultiIndex.from_arrays(df.filter(like='GROUP').values, names=df.REGION.values)
d = pd.DataFrame(midx.levels, midx.names)
d.stack().groupby(level=0).value_counts().unstack().rename_axis('REGION')

更快的方法:

更快的方法是使用 pd.unique 创建唯一的行值(比 np.unique 快,因为它在找到唯一元素后不执行排序操作)同时遍历与 GROUP_X 对应的数组柱子。这占用了大部分时间。然后,stack , groupby , value_counts最后 unstack它回来了。

d = pd.DataFrame([pd.unique(i) for i in df.filter(like='GROUP').values], df.REGION)
d.stack().groupby(level=0).value_counts(sort=False).unstack()

enter image description here

关于python - 按列值和行值对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41446178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com