使用Pandas将变量转换为多列:考古遗留数据格式转换需求
用Pandas将考古遗址多时间记录转换为阶段二进制列
嘿,我来一步步教你搞定这份考古遗址时间数据的格式转换——这种同一遗址跨多个时间阶段的重复记录,在考古数据处理里是非常典型的场景!
先明确需求
你手头的遗留数据核心字段是:
NUM: 遗址的唯一标识符TEMPORAL: 遗址对应的时间阶段
因为部分遗址存在多个时间占用情况,原始数据会重复出现同一NUM的多行记录。我们要把它转成宽格式:每个遗址一行,每个时间阶段作为独立列,该遗址存在对应阶段就填1,否则填0。
实操步骤
1. 先模拟原始数据(你可以替换成自己的真实数据)
import pandas as pd # 模拟你的原始数据结构 raw_data = pd.DataFrame({ "NUM": ["S001", "S001", "S002", "S003", "S003", "S003"], "TEMPORAL": ["新石器时代", "青铜时代", "青铜时代", "旧石器时代", "新石器时代", "铁器时代"] }) print("原始数据:") print(raw_data)
运行后输出的原始数据长这样:
原始数据: NUM TEMPORAL 0 S001 新石器时代 1 S001 青铜时代 2 S002 青铜时代 3 S003 旧石器时代 4 S003 新石器时代 5 S003 铁器时代
2. 生成时间阶段的二进制列
用Pandas的get_dummies()函数,它能自动把TEMPORAL这种分类变量拆成二进制列(存在则为1,否则为0):
# 生成时间阶段的哑变量(二进制列) temporal_dummies = pd.get_dummies(raw_data["TEMPORAL"], prefix="", prefix_sep="") # 把唯一标识符NUM和哑变量列合并 combined_data = pd.concat([raw_data["NUM"], temporal_dummies], axis=1)
3. 按遗址分组聚合,去重并保留阶段标识
同一遗址可能有重复的时间阶段记录,我们按NUM分组后取max()——这样只要该遗址存在某阶段,就会保留1,不存在则为0:
# 分组聚合得到最终结果 final_result = combined_data.groupby("NUM").max().reset_index() print("\n转换后的数据:") print(final_result)
最终输出的格式完全符合你的需求:
转换后的数据: NUM 旧石器时代 新石器时代 青铜时代 铁器时代 0 S001 0 1 1 0 1 S002 0 0 1 0 2 S003 1 1 0 1
额外小贴士
- 如果原始数据还有其他需要保留的字段(比如遗址位置、类型),可以在
concat时一起加入,分组时对这些字段用first()或mean()等合适的聚合方式(比如groupby("NUM").agg({"NUM":"first", "LOCATION":"first", "旧石器时代":"max"...})) - 如果
TEMPORAL列有格式不统一的情况(比如空格、大小写、别名),记得先做数据清洗:比如用raw_data["TEMPORAL"] = raw_data["TEMPORAL"].str.strip()去空格,或者用replace()统一别名
内容的提问来源于stack exchange,提问作者Computarch
相关产品推荐
相关产品推荐

