【python】pandas.DataFrame实现“一行拆多行”和“多行并一行”

1.一行拆多行

当一行的单元格中是由统一分隔符分隔的多个字符串,希望实现按分隔符拆分,每个字符串占一行。

(1)原数据df

(2)处理步骤

#一、把“商品”字段拆分,分为多列
df_tmp=df['商品'].str.split(',',expand=True)
df_tmp

#二、将行索引转变成列索引(第二层),得到一个层次化的Series
df_tmp=df_tmp.stack()
df_tmp

 

# 三、重置索引,并删除多于的索引
df_tmp = df_tmp.reset_index(level=1,drop=True)
df_tmp

# 四、与原始数据合并
df_tmp.name='商品'
df_new = df.drop(['商品'], axis=1).join(df_tmp).reset_index().drop(columns='index')
df_new

 (3)代码整合

# 一、把“商品”字段拆分,分为多列
df_tmp=df['商品'].str.split(',',expand=True)
# 二、把行转列成列
df_tmp=df_tmp.stack()
# 三、重置索引,并删除多于的索引
df_tmp = df_tmp.reset_index(level=1,drop=True)
# 四、与原始数据合并
df_tmp.name='商品'
df_new = df.drop(['商品'], axis=1).join(df_tmp).reset_index().drop(columns='index')

2.多行并一行

(1)原数据df

 (2)处理步骤

# 定义函数,做分组聚合
def func(df):
    return ','.join(df.values)
# 给DataFrame应用函数
df = df.groupby(by='客户编号').agg(func).reset_index()
df

 

 3.总结

        一行转多行稍微复杂一些,需要先将一个单元格中包含多个元素的长字符串根据分隔符切割,以含有最多个元素的行为准,分成对应个数的列,其余不足最多个数的行所余出列用null填充,分为多列后,再将行索引转变成列索引,一行数据就变成了两层结构多行数据,重置索引后与原数据合并即可。

        多行转一行就很简单,只需要定义一个拼接dataframe的值的函数,再将整个dataframe分组聚合拼接即可。

  • 19
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值