python - 如何在 Pandas 中拆分多列
问题描述
我有一个如下数据框:
df = pd.DataFrame({'var1': ['0,3788,99,20.88', '3,99022,08,91.995'],
'var2': ['0,929,92,299.90', '1,38333,9,993.11'],
'var3': ['8,9332,99,29.10', '7,922111,07,45.443']})
Out[248]:
var1 var2 var3
0 0,3788,99,20.88 0,929,92,299.90 8,9332,99,29.10
1 3,99022,08,91.995 1,38333,9,993.11 7,922111,07,45.443
我想用逗号分割每一列,并将新的一组列彼此相邻。因此生成的数据框应如下所示:
df2 = pd.DataFrame({('var1', 'x1'): [0, 3], ('var1', 'x2'): [3788, 99022], ('var1', 'x3'): [99, '08'], ('var1', 'x4'): [20.88, 91.995],
('var2', 'x1'): [0, 1], ('var2', 'x2'): [929, 38333], ('var2', 'x3'): [92, 9], ('var2', 'x4'): [299.90, 993.11],
('var3', 'x1'): [8, 7], ('var3', 'x2'): [9332, 922111], ('var3', 'x3'): [99, '07'], ('var3', 'x4'): [29.10, 45.443]})
Out[249]:
var1 var2 var3
x1 x2 x3 x4 x1 x2 x3 x4 x1 x2 x3 x4
0 0 3788 99 20.880 0 929 92 299.90 8 9332 99 29.100
1 3 99022 08 91.995 1 38333 9 993.11 7 922111 07 45.443
这MultiIndex
不是强制性的,但我希望有机会轻松收集数据并在需要时获取 df3:
var x1 x2 x3 x4
0 var1 0 3788 99 20.880
1 var1 3 99022 08 91.995
0 var2 0 929 92 299.900
1 var2 1 38333 9 993.110
0 var3 8 9332 99 29.100
1 var3 7 922111 07 45.443
pd.melt
我的努力包括str.split
:
df_long = pd.melt(df.reset_index(drop = False), id_vars = 'index', var_name = 'var', value_name = 'values') \
.sort_values(['index', 'var']) \
.set_index('index')
df_long = df_long['values'].str.split(',', expand = True)
df_long.columns = ['x' + str(i) for i in range(df_long.shape[1])]
但是:1)我不知道如何将不同的数据var1, var2, var3...
彼此相邻传播 2)从宽格式转换为长格式(df
to df_long
)然后再转换回来(df_long
to df3
)似乎效率很低,我关心寻求的性能解决方案。
那么从 to 转换的最佳方法是什么df
,df2
以便我们可以df3
在需要时轻松获得?
解决方案
这是一种首先获得 df3 的方法:
df3 = pd.concat([df[s].str.split(',', expand=True).add_prefix("x").assign(var=s) for s in df])
print(df3)
x0 x1 x2 x3 var
0 0 3788 99 20.88 var1
1 3 99022 08 91.995 var1
0 0 929 92 299.90 var2
1 1 38333 9 993.11 var2
0 8 9332 99 29.10 var3
1 7 922111 07 45.443 var3
接着:
df2 = df3.set_index("var", append=True).unstack().swaplevel(axis=1).sort_index(axis=1)
print(df2)
var var1 var2 var3
x0 x1 x2 x3 x0 x1 x2 x3 x0 x1 x2 x3
0 0 3788 99 20.88 0 929 92 299.90 8 9332 99 29.10
1 3 99022 08 91.995 1 38333 9 993.11 7 922111 07 45.443
推荐阅读
- javascript - 我如何将价格添加到我的购物车中,例如切换?
- python - 如何在指定的时间间隔使用 shift 填充 pandas 中的缺失值?
- python - Python pytube 计算下载速度和经过的时间
- css - 使用纯 CSS 在悬停效果上闪烁文本
- python-3.x - Xtics 标签未在整个高度中显示
- c# - LINQ - 对于选择中的每个项目,将值填充到一个未填充的属性
- assembly - Mips 参考表上的“PC”
- android - android kotlin 视图绑定 IllegalStateException 不能为空
- python - 我想使用 selenium 从表中获取内容到数组
- gcc - SFML 2.5.1 和带有 GCC 5.1.0 的 CodeBlocks - 项目编译错误