看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在本例中,我们将一个有多个类型的数据,进行分组聚合,将后边对应的多个列的值拼接在一起。我们来看看如何用 pandas 高效完成这样的一个需求。
有一个 DataFrame 数据,其中的列包括多个分类和多个值,不同的行可以有相同或不同的ID值。
import pandas as pd
import io
data = '''
ID type1 type2 value1 value2 value3
1 dog yellow 1 2 3
1 dog yellow 5 6 7
2 cat brown 1 1 1
3 mouse blue 1 1 1
1 dog yellow 1 2 3
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
希望处理后形成一个新的数据帧,这样每一行都只有一个唯一的类型,并且特定的列值只是附加在后边,值按顺序用空格拼接起来。
效果如下:
'''
type1 type2 value
0 cat brown 1 1 1
1 dog yellow 1 2 3 5 6 7 1 2 3
2 mouse blue 1 1 1
'''
我们可以将 type1、type2 设置为索引,再堆叠形成一个多索引的 Series,这时 Series 的值就是 value1、value2、value3 的值,索引的最右侧就是原表中的对应的 value1、value2、value3。然后对 type1、type2 分组,聚合各组的值为用空格字符串的 join() 方法拼接起来。
最后重置索引,得到最终的 DataFrame。
先设置索引:
group = ['ID', 'type1', 'type2']
(
df.set_index(group)
)
'''
value1 value2 value3
ID type1 type2
1 dog yellow 1 2 3
yellow 5 6 7
2 cat brown 1 1 1
3 mouse blue 1 1 1
1 dog yellow 1 2 3
'''
对数据进行堆叠:
group = ['ID', 'type1', 'type2']
(
df.set_index(group)
.stack()
)
'''
ID type1 type2
1 dog yellow value1 1
value2 2
value3 3
value1 5
value2 6
value3 7
2 cat brown value1 1
value2 1
value3 1
3 mouse blue value1 1
value2 1
value3 1
1 dog yellow value1 1
value2 2
value3 3
dtype: int64
'''
分组聚合拼接:
group = ['ID', 'type1', 'type2']
(
df.set_index(group)
.stack()
.groupby(group)
.agg(lambda x: ' '.join(x.astype(str)))
)
'''
ID type1 type2
1 dog yellow 1 2 3 5 6 7 1 2 3
2 cat brown 1 1 1
3 mouse blue 1 1 1
dtype: object
'''
重置索引转为 DataFrame:
group = ['ID', 'type1', 'type2']
(
df.set_index(group)
.stack()
.groupby(group)
.agg(lambda x: ' '.join(x.astype(str)))
.reset_index(name='value')
)
'''
ID type1 type2 value
0 1 dog yellow 1 2 3 5 6 7 1 2 3
1 2 cat brown 1 1 1
2 3 mouse blue 1 1 1
'''
即可完成最终的需求。
如果不需要将 value 的拼接数字按原来的排序,可以用 melt() 方法先进行处理,最终代码是:
group = ['ID', 'type1', 'type2']
(
df.melt(group)
.groupby(group, as_index=False)
.value
.apply(lambda x: ' '.join(x.astype(str)))
)
'''
ID type1 type2 value
0 1 dog yellow 1 5 1 2 6 2 3 7 3
1 2 cat brown 1 1 1
2 3 mouse blue 1 1 1
'''
参考:https://stackoverflow.com/questions/77076223/python-copying-rows-with-same-id-values
(完)
更新时间:Aug. 18, 2024, 4:18 p.m. 标签:pandas python 拼接