如何在Pandas中基于另一列值拆分列并重塑DataFrame?
Pandas基于另一列拆分列的实现方法
当然可以实现这个需求!本质上咱们是要把长格式的DataFrame转成宽格式,用Pandas的分组+重塑工具就能轻松搞定。下面给你一步步演示具体操作:
1. 先准备好原始数据
首先导入Pandas并定义你给出的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'col1':['a','a','b','b','c','c'], 'col2':['str_a1','str_a2','str_b1','str_b2','str_c1','str_c2'] })
2. 给每个分组添加行序号
因为每个col1的取值(比如'a')对应两行col2的数据,咱们需要给每组内的行标记是第1个还是第2个。这里用groupby结合cumcount()来实现——cumcount()会在每个分组内从0开始计数,加1后就得到1、2的序号:
df['row_num'] = df.groupby('col1').cumcount() + 1
这时候DataFrame会变成这样:
| col1 | col2 | row_num |
|---|---|---|
| a | str_a1 | 1 |
| a | str_a2 | 2 |
| b | str_b1 | 1 |
| b | str_b2 | 2 |
| c | str_c1 | 1 |
| c | str_c2 | 2 |
3. 用pivot重塑数据
接下来用pivot()方法把长格式转成宽格式:
index='col1':把col1作为结果的行索引columns='row_num':把刚才生成的序号作为列的区分标识values='col2':把col2的值填充到对应的位置
df_pivoted = df.pivot(index='col1', columns='row_num', values='col2').reset_index()
4. 重命名列名匹配目标格式
现在的列名是col1、1、2,咱们把它们改成需要的col1_1、col2_1、col2_2:
df_pivoted.columns = ['col1_1', 'col2_1', 'col2_2']
最终结果
运行完上面的步骤,你就得到了目标的df2:
print(df_pivoted) # 输出: col1_1 col2_1 col2_2 0 a str_a1 str_a2 1 b str_b1 str_b2 2 c str_c1 str_c2
简化版一行代码
如果你喜欢更简洁的写法,可以把所有步骤链式调用:
df2 = (df.assign(row_num=df.groupby('col1').cumcount()+1) .pivot(index='col1', columns='row_num', values='col2') .reset_index() .rename(columns={'col1':'col1_1', 1:'col2_1', 2:'col2_2'}))
额外说明
这个方法不仅适用于每组2行的情况,如果你的数据里col1的每个分组有更多行(比如3行),它会自动生成col2_3这样的列,兼容性很强哦!
内容的提问来源于stack exchange,提问作者Gustavo Mirapalheta
相关产品推荐
相关产品推荐

