如何在Pandas DataFrame中实现单列值的一对多替换并复制对应列数据
实现DataFrame中Geo列的一对多映射并复制对应行数据
这里有个用pandas快速解决这个需求的方案,步骤清晰,代码简洁:
首先,我们先准备好示例数据和映射字典:
import pandas as pd # 你的原始输入DataFrame df = pd.DataFrame({ "Date": ["2020-01-01", "2020-01-01", "2020-01-01", "2020-01-02", "2020-01-02"], "Geo": ["USA", "BRA", "CHN", "EU1", "EU2"], "Shipment": [1000, 5865, 4789, 6541, 3258] }) # 定义你的映射字典 geo_mapping = { "EU1": ["ALA", "BEL", "AND", "AUT"], "EU2": ["AUT", "BEL", "BGR", "HRV", "CZE"], "EU3": ["EST", "HRV", "FRA", "DEU"] }
接下来执行两步核心操作:
将Geo列转换为对应国家列表:
用map方法匹配映射字典,把每个Geo值替换成对应的国家列表;对于不在映射字典里的Geo值(比如USA、BRA、CHN),我们将其转为单元素列表,这样后续不会丢失这些行:df['Geo'] = df['Geo'].map(geo_mapping).fillna(df['Geo'].apply(lambda x: [x]))展开列表为多行:
使用explode方法把列表类型的Geo列拆分成独立行,Date和Shipment列的数值会自动复制到每一行:result_df = df.explode('Geo').reset_index(drop=True)
运行后你就能得到想要的结果,比如EU1对应的行会被拆成4行,分别对应ALA、BEL、AND、AUT,每行的Shipment值都是6541;而未在映射字典中的USA会保留单独一行。
输出的结果示例片段:
Date Geo Shipment 0 2020-01-01 USA 1000 1 2020-01-01 BRA 5865 2 2020-01-01 CHN 4789 3 2020-01-02 ALA 6541 4 2020-01-02 BEL 6541 5 2020-01-02 AND 6541 6 2020-01-02 AUT 6541 7 2020-01-02 AUT 3258 8 2020-01-02 BEL 3258 9 2020-01-02 BGR 3258 ...
内容的提问来源于stack exchange,提问作者RoshADM
相关产品推荐
相关产品推荐

