【数据处理】pandas DataFrame 实现 某列中分隔数据转成多行 split explode

DataFrame中某列由“逗号”分隔,格式如下。希望转换后,分隔的数据全部以多行的形式重新展示。
处理前:
处理前
处理后:
【数据处理】pandas DataFrame 实现 某列中分隔数据转成多行 split explode_第1张图片

方法一

转换代码如下。

import pandas as pd
df = pd.DataFrame([{'var1': 'a,b,c', 'var2': 1},
                   {'var1': 'd,e', 'var2': 2}])
                  
df1 = pd.concat([pd.Series(row['var2'], row['var1'].split(',')) for _, row in df.iterrows()]).reset_index()
df1.columns = ['var1', 'var2']

df1就是转换后的结果。

原问题地址,https://stackoverflow.com/questions/12680754/split-explode-pandas-dataframe-string-entry-to-separate-rows
问题中很多人给出了答案,经过我的测试,上面给出的代码是最简单并且较容易理解的。
当然代码被我优化了一下,这样写更容易理解。

pd.Series第一个参数是data,第二个参数是index。
【数据处理】pandas DataFrame 实现 某列中分隔数据转成多行 split explode_第2张图片
所以上述操作其实是,使用pd.Series将第二列转换成index,pd.concat合并后,再使用reset_index把index变成普通列,给列重新赋值得到的结果,很巧妙了。

方法二

虽然上面的方法一句话就能完成,但是有个弊端,就是耗时太久。
下面介绍的方法可以很大程度上提高计算速率

import numpy as np
df['var1'] = df.var1.apply(lambda x: x.split(','))
vals = df.var1.values.tolist()
rs = [len(r) for r in vals]
a = np.repeat(df.var2, rs)

df1 = pd.DataFrame(np.column_stack((a, np.concatenate(vals))), columns=['var2', 'var1'])
df1 = df1[['var1', 'var2']]

这种方法有个问题,就是假如 df 中没有 , 隔开的数字时就会出现报错,因为 np.concatenate 不能接受长度全部为1的多重列表。

你可能感兴趣的:(python技巧)