Python Pandas新手求助:如何合并DataFrame字符串并拆分列?
解决你的Pandas DataFrame合并与拆分需求
嘿,刚接触Python和Pandas是吧?别慌,你要的这两个操作其实很容易实现,我给你一步步拆解,附带可运行的代码:
首先,先把你提供的DataFrame_1用代码构造出来,方便你复现:
import pandas as pd # 构造DataFrame_1 df1 = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a', 'a', 'a'], 'id_name': ['name_a', 'name_b', 'name_a', 'name_b', 'name_a', 'name_b'], 'revenue': [65, 65, 70, 70, 121, 121] })
第一步:生成DataFrame_2(按revenue合并字符串)
我们需要按id和revenue分组,把每组里的id_name用逗号加空格连接起来。用groupby配合agg就能搞定:
# 分组聚合得到DataFrame_2 df2 = df1.groupby(['id', 'revenue'])['id_name'].agg(', '.join).reset_index() # 调整列的顺序(和你给出的DataFrame_2结构一致) df2 = df2[['id', 'id_name', 'revenue']]
这里的groupby(['id', 'revenue'])会把所有id和revenue都相同的行归为一组,agg(', '.join)则把每组里的id_name字符串用, 拼接起来,最后reset_index()是把分组的键变回普通列,避免索引混乱。
运行后你得到的df2就和你想要的DataFrame_2完全一致啦!
第二步:生成DataFrame_3(拆分id_name列)
接下来把df2里的id_name列拆分成两列id_name1和id_name2,用str.split方法就能实现:
# 拆分id_name列,expand=True会把拆分结果变成多列 split_cols = df2['id_name'].str.split(', ', expand=True) # 给拆分后的列命名 split_cols.columns = ['id_name1', 'id_name2'] # 把拆分后的列和原df2的id、revenue列合并,得到DataFrame_3 df3 = pd.concat([df2[['id', 'revenue']], split_cols], axis=1) # 调整列的顺序(和你给出的DataFrame_3结构一致) df3 = df3[['id', 'id_name1', 'id_name2', 'revenue']]
这里str.split(', ', expand=True)会把每个id_name字符串按, 分割成两个元素,并且扩展成两列;pd.concat则把原数据的id、revenue列和拆分后的列横向拼接起来,最后调整列顺序就得到了你要的DataFrame_3。
如果你想更简洁一点,也可以直接在df2上操作:
df3 = df2.assign( id_name1=df2['id_name'].str.split(', ', expand=True)[0], id_name2=df2['id_name'].str.split(', ', expand=True)[1] ).drop('id_name', axis=1)[['id', 'id_name1', 'id_name2', 'revenue']]
这个写法用assign直接添加新列,然后删掉原来的id_name列,再调整顺序,结果是一样的。
内容的提问来源于stack exchange,提问作者Владислав Никитенко
相关产品推荐
相关产品推荐

