gpt4 book ai didi

python - 想要在 python 中执行分组,其中分组的数据将进入行

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:26 25 4
gpt4 key购买 nike

我有这样的数据:

ID Value
1 ABC
1 BCD
1 AKB
2 CAB
2 AIK
3 KIB

我想执行一个操作,这会给我这样的结果:

ID Value1 Value2 Value3
1 ABC BCD AKB
2 CAB AIK
3 KIB

我使用SAS,其中使用retain 和by 我们用来得到答案。在Python中我没有任何办法。我知道我必须使用 group by 等等。但不知道可以用什么。在Pyspark中使用group by和collect_list我们可以以数组格式获取它,但我想在Pandas数据帧中进行

最佳答案

使用set_indexcumcount对于 MultiIndex ,然后按 unstack reshape :

df1 = (df.set_index(['ID',df.groupby('ID').cumcount()])['Value']
.unstack()
.rename(columns=lambda x: 'Value{}'.format(x + 1))
.reset_index())

对于 python 3.6+ 可以使用 f-string 重命名列名称:

df1 = (df.set_index(['ID',df.groupby('ID').cumcount()])['Value']
.unstack()
.rename(columns=lambda x: f'Value{x+1}')
.reset_index())

另一个想法是通过构造函数创建列表和新的DataFrame:

s = df.groupby('ID')['Value'].apply(list)
df1 = (pd.DataFrame(s.values.tolist(), index=s.index)
.rename(columns=lambda x: 'Value{}'.format(x + 1))
.reset_index())
print (df1)
ID Value1 Value2 Value3
0 1 ABC BCD AKB
1 2 CAB AIK NaN
2 3 KIB NaN NaN

性能:取决于行数和 ID 列的唯一值数量:

np.random.seed(45)

a = np.sort(np.random.randint(1000, size=10000))
b = np.random.choice(list('abcde'), size=10000)

df = pd.DataFrame({'ID':a, 'Value':b})
#print (df)
<小时/>
In [26]: %%timeit
...: (df.set_index(['ID',df.groupby('ID').cumcount()])['Value']
...: .unstack()
...: .rename(columns=lambda x: f'Value{x+1}')
...: .reset_index())
...:
8.96 ms ± 628 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [27]: %%timeit
...: s = df.groupby('ID')['Value'].apply(list)
...: (pd.DataFrame(s.values.tolist(), index=s.index)
...: .rename(columns=lambda x: 'Value{}'.format(x + 1))
...: .reset_index())
...:
...:
105 ms ± 7.39 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

#jpp solution
In [28]: %%timeit
...: def group_gen(df):
...: for key, x in df.groupby('ID'):
...: x = x.set_index('ID').T
...: x.index = pd.Index([key], name='ID')
...: x.columns = [f'Value{i}' for i in range(1, x.shape[1]+1)]
...: yield x
...:
...: pd.concat(group_gen(df)).reset_index()
...:

3.23 s ± 20.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 想要在 python 中执行分组,其中分组的数据将进入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557610/

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