本案例是一个行转列的例子,通常我们在统计数据时,会整理一个一维的序列,因为这样做比较方便,但在数据分析时,可能需要根据标签将这个序列转为多们维度的数据。我们来看如何用 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), delim_whitespace=True)
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)
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)
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
这样就实现了需求。
pandas 实战案例集
2023-09-01 11:21:28
pandas agg() 聚合操作
2022-11-14 11:50:04
pandas apply() 按轴应用函数
2022-07-04 23:55:35
pandas 索引 Indexing
2022-02-16 23:46:55