说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例是一个行转列的例子,通常我们在统计数据时,会整理一个一维的序列,因为这样做比较方便,但在数据分析时,可能需要根据标签将这个序列转为多们维度的数据。我们来看如何用 pandas 来处理这个操作。
源数据如下:
import pandas as pd
import io
data = '''
name value
C 3
E 5
D 4
D 7
E 8
C 6
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
'''
name value
0 C 3
1 E 5
2 D 4
3 D 7
4 E 8
5 C 6
'''
以上数据我们可以认为是一个序列,name 是标签,value 是值,我们需每个标签有两个值,我们要根据 name 的值将数据转为两列,列名分别为 value1 和 value2。效果如:
'''
name value1 value2
0 C 3 6
1 D 4 7
2 E 5 8
'''
我们需要先将数据按 name 先分组,将分组内的 value 转为列表,再对每行应用 pd.Series 会转为按位置对齐的 DataFrame。
最后用 rename 修改一下列名,重置索引即可完成操作。
先分组,再将每组的 value 转为列表:
(
df.groupby('name')
.value.agg(list)
)
'''
name
C [3, 6]
D [4, 7]
E [5, 8]
Name: value, dtype: object
'''
应用 pd.Series 转为 DataFrame:
(
df.groupby('name')
.value.agg(list)
.apply(pd.Series)
)
'''
0 1
name
C 3 6
D 4 7
E 5 8
'''
修改列名,重置索引:
(
df.groupby('name')
.value.agg(list)
.apply(pd.Series)
.rename(lambda x: f'value{x+1}', axis=1)
.reset_index()
)
'''
name value1 value2
0 C 3 6
1 D 4 7
2 E 5 8
'''
这样就实现了需求。
(完)
更新时间:Aug. 18, 2024, 4:17 p.m. 标签:pandas python 重复