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分组聚合拼接即可。