gpt4 book ai didi

python - 根据 Python Pandas 中的其他列对列进行分组

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

假设我有以下 pd.DataFrame:

Name | Color
------------------------------
John | Blue
Greg | Red
John | Yellow
Greg | Red
Greg | Blue

我想获取每个名称的不同颜色表 - 数量及其值。意思是,像这样:

Name | Distinct | Values
--------------------------------------
John | 2 | Blue, Yellow
Greg | 2 | Red, Blue

有什么想法吗?

最佳答案

使用groupby + agg,传递聚合函数的自定义list:

f = [
('Distinct', 'nunique'),
('Values', lambda x: ', '.join(x.unique()))
]

df.groupby('Name').Color.agg(f).reset_index()

Name Distinct Values
0 Greg 2 Red, Blue
1 John 2 Blue, Yellow

时间

首先,设置 -

df = pd.DataFrame(
np.random.randint(0, 1000, (10000, 2)).astype(str), columns=['Name', 'Color']
)

接下来,时间安排。似乎 pd.Series.unique 慢得不合理(慢 4 倍)。为了性能,我将使用 np.unique 代替:

# in this answer

%%timeit
f = [
('Distinct', 'nunique'),
('Values', lambda x: ', '.join(np.unique(x.values).tolist()))
]

df.groupby('Name').Color.agg(f).reset_index()

122 ms ± 1.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

使用 lambda x: ', '.join(x.unique()) 会导致速度降低 4 倍。使用 set 可以更快地处理这些数据,但这真的取决于情况。

# @jpp

%%timeit
v = df.groupby('Name')['Color'].apply(set).reset_index()
v['Distinct'] = v['Color'].map(len)
v['Color'] = v['Color'].map(', '.join)

219 ms ± 1.83 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# @jezrael

%%timeit
(df.groupby('Name')['Color'].agg(['nunique', lambda x: ', '.join(set(x))])
.rename(columns={'nunique':'Distinct', '<lambda>':'Values'})
.reset_index())

118 ms ± 4.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

性能随数据变化很大,您可能希望在决定使用什么之前根据您自己的数据对所有解决方案进行计时。

关于python - 根据 Python Pandas 中的其他列对列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881437/

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