You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:58:21