在数据分析中,经常需要对数据进行重组和转换,以便更好地展示数据。以下示例演示Pandas的实战技巧:如何从DataFrame的一列数据创建多个列,并根据特定字段进行分组。
需求
假设我们有一个工作清单,包含工作编号、状态和零件信息。我们想将这个清单转换为一个表格,其中每一行代表一个工作,并包含以下信息:
- 工作编号
- 每个状态对应的列(例如,“ON_ORDER”, “ACTIVE”, “TO_BE_ALLOCATED”),值为True或False,表示该工作是否处于该状态
- 所有零件的列表,用换行符”\n”分隔
示例数据
import pandas as pd
work = pd.DataFrame({
"JOB": ['JOB01', 'JOB01', 'JOB02', 'JOB02', 'JOB03', 'JOB03'],
"STATUS": ['ON_ORDER', 'ACTIVE', 'TO_BE_ALLOCATED', 'ON_ORDER', 'ACTIVE', 'TO_BE_ALLOCATED'],
"PART": ['PART01', 'PART02', 'PART03', 'PART04', 'PART05', 'PART06']
})
print(work)
输出:
JOB STATUS PART
0 JOB01 ON_ORDER PART01
1 JOB01 ACTIVE PART02
2 JOB02 TO_BE_ALLOCATED PART03
3 JOB02 ON_ORDER PART04
4 JOB03 ACTIVE PART05
5 JOB03 TO_BE_ALLOCATED PART06
目标输出
JOB ACTIVE ON_ORDER TO_BE_ALLOCATED PART_CON
0 JOB01 True True False PART01\nPART02
1 JOB02 False True True PART03\nPART04
2 JOB03 True False True PART05\nPART06
实现步骤
一、连接零件信息
首先,我们需要将每个工作对应的零件信息连接起来。可以使用groupby
函数按”JOB”字段分组,然后使用agg(", ".join)
将每个组中的”PART”字段的值用逗号和空格连接起来。最后,使用rename
函数将新列命名为”PART_CON”。
x = work.groupby("JOB")["PART"].agg(", ".join).rename("PART_CON")
print(x)
输出:
JOB PART_CON
JOB01 PART01, PART02
JOB02 PART03, PART04
JOB03 PART05, PART06
二、创建状态列
接下来,我们需要创建基于”STATUS”值的列。可以使用pd.crosstab
函数创建一个交叉表,该表将”JOB”字段作为行,”STATUS”字段作为列,并计算每个组合出现的次数。然后使用astype(bool)
将计数转换为布尔值,表示每个状态是否存在于每个工作中。
y = pd.crosstab(work["JOB"], work["STATUS"]).astype(bool)
print(y)
输出:
JOB STATUS ACTIVE ON_ORDER TO_BE_ALLOCATED
JOB01 True True False
JOB02 False True True
JOB03 True False True
三、连接结果
最后,我们使用pd.concat
函数将两个结果DataFrame沿列(axis=1)连接起来,并使用reset_index
重置索引,以便”JOB”字段成为一列。
result = pd.concat([y, x], axis=1).reset_index()
print(result)
最终输出:
JOB ACTIVE ON_ORDER TO_BE_ALLOCATED PART_CON
0 JOB01 True True False PART01, PART02
1 JOB02 False True True PART03, PART04
2 JOB03 True False True PART05, PART06
通过以上三个步骤,我们就成功地将原始数据转换成了我们想要的格式。