python - 无法根据第一列值将列拆分为多列

标签 python python-3.x pandas dataframe pandas-groupby

我有一个包含一列的数据框。下面是示例

Questionsbysortorder        
        
Q1-4,Q2-3,Q3-2,Q4-3,Q5-3            
Q1-1,Q2-2,Q3-1,Q4-1             
Q1-5,Q2-3,Q3-3  

我正在尝试借助已经给定的行值来分解列。如下例所示

Questionsbysortorder        Q1    Q2   Q3   Q4   Q5
             
Q1-4,Q2-3,Q3-2,Q4-3,Q5-3    4     3    2    3    3  
Q1-1,Q2-2,Q3-1,Q4-1         1     2    1    1    NA 
Q1-5,Q2-3,Q5-3              5     3    NA   NA   3

下面是我尝试过的代码,但它返回错误

import pandas as pd
import numpy as np

df = pd.DataFrame({'Questionsbysortorder': ['Q1-4,Q2-3,Q3-2,Q4-3,Q5-3', 'Q1-1,Q2-2,Q3-1,Q4-1','Q1-5,Q2-3,Q5-3']})

df['Questionsbysortorder'] = df['Questionsbysortorder'].str.split(',')

df = df.explode('Questionsbysortorder')

df['Questionsbysortorder'] = df['Questionsbysortorder'].str.split('-')

df = df.explode('Questionsbysortorder')

df = df.set_index('Questionsbysortorder').unstack().reset_index()

df.columns = ['Questionsbysortorder', 'value']

df = df.pivot(index='Questionsbysortorder', columns='value', values='Questionsbysortorder')

df.columns.name = None

print(df)

错误是:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-30dd8b8d4f59> in <module>()
     14 df = df.set_index('Questionsbysortorder').unstack().reset_index()
     15 
---> 16 df.columns = ['Questionsbysortorder', 'value']
     17 
     18 df = df.pivot(index='Questionsbysortorder', columns='value', values='Questionsbysortorder')

4 frames
/usr/local/lib/python3.7/dist-packages/pandas/core/internals/base.py in _validate_set_axis(self, axis, new_labels)
     56         elif new_len != old_len:
     57             raise ValueError(
---> 58                 f"Length mismatch: Expected axis has {old_len} elements, new "
     59                 f"values have {new_len} elements"
     60             )

ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements

有人可以帮我解决这个问题吗?

最佳答案

你们很接近。你想要

  • ',',
  • 分割
  • 分解列表,
  • 再次按'-'拆分以获得不同的字段
  • 最终对数据进行透视

在代码中:

df.join(df.Questionsbysortorder.str.split(',')
   .explode()
   .str.split('-', expand=True)
   .set_index(0, append=True)[1]
   .unstack()
)

输出:

       Questionsbysortorder Q1 Q2 Q3   Q4   Q5
0  Q1-4,Q2-3,Q3-2,Q4-3,Q5-3  4  3  2    3    3
1       Q1-1,Q2-2,Q3-1,Q4-1  1  2  1    1  NaN
2            Q1-5,Q2-3,Q3-3  5  3  3  NaN  NaN

关于python - 无法根据第一列值将列拆分为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72936816/

相关文章:

python - 如何从其他指定列替换 DataFrame 的元素

python - Instagram-API 与 python

python - 多处理值因锁定而挂起

pandas - 可视化 pandas 分组数据

pandas - 为什么 `&=` 会出现在 pandas 数据框中?

python - 如何在 python 3.6.2 中使用 suds.client 库?

python - 通过 Python 打印碱基名称

python - 如何将 typedef 变量的指针实现到 SWIG 中?参数 2 类型为 'BYTE const *' 错误

python - 找不到 apache2 flask 应用程序 css 文件?

python - 修剪/缩尾标准差