首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法根据第一个列值将列拆分为多个列。

无法根据第一个列值将列拆分为多个列。
EN

Stack Overflow用户
提问于 2022-07-11 10:05:08
回答 2查看 45关注 0票数 2

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

代码语言:javascript
复制
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  

我试图在已经给出的行值的帮助下爆炸列。如下所示

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)

错误是:

代码语言:javascript
复制
---------------------------------------------------------------------------
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

有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-11 10:09:41

你们很亲密。你想要

  • ','拆分,
  • 爆炸列表,
  • 再被'-'分割得到
  • 最后支点数据H 210F 211

代码:

代码语言:javascript
复制
df.join(df.Questionsbysortorder.str.split(',')
   .explode()
   .str.split('-', expand=True)
   .set_index(0, append=True)[1]
   .unstack()
)

输出:

代码语言:javascript
复制
       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
票数 2
EN

Stack Overflow用户

发布于 2022-07-11 12:53:16

另一种将列拆分为多列的方法是使用str.findall()方法,下面是一个示例:

代码语言:javascript
复制
res = df.Questionsbysortorder.str.findall(r'(Q\d+)-(\d+)').apply(lambda x: pd.Series(dict(x)))

print(res)
'''
  Q1 Q2   Q3   Q4   Q5
0  4  3    2    3    3
1  1  2    1    1  NaN
2  5  3  NaN  NaN    3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72936816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档