如何将列拆分为具有某些功能的多列?

Posted

技术标签:

【中文标题】如何将列拆分为具有某些功能的多列?【英文标题】:How to split column to multiple columns with some features? 【发布时间】:2020-10-13 16:43:02 【问题描述】:

我有这样的专栏

col1  
(0,0):19,(1,1):155  
(0,0):13,(0,1):32,(1,1):34  
(0,0):56,(1,0):43,(1,1):38  
(0,0):67,(0,1):45,(1,0):98,(1,1):70

我想把它分成四列:

(0,0)    (0,1)    (1,0)    (1,1)  
19        0        0       155  
13        32       0       34  
56        0        43      38  
67        45       98      70

我试过col.str.split(',\s*(?![^()]*\))',expand=True),但只能得到:

col1    col2    col3    col4  
(0,0):19    (1,1):155    NAN    NAN  
(0,0):13    (0,1):32     (1,1):34    NAN   
(0,0):56    (1,0):43     (1,1):38    NAN  
(0,0):67    (0,1):45     (1,0):98   (1,1):70

我想知道是否有办法获得我上面显示的内容?非常感谢! 鲲

【问题讨论】:

【参考方案1】:

您可以提取(0,0)(0,1)(1,0)(1,1) 之后的数字,然后删除col1 列:

import pandas as pd
df = pd.DataFrame('col1': ['(0,0):19,(1,1):155','(0,0):13,(0,1):32,(1,1):34','(0,0):56,(1,0):43,(1,1):38','(0,0):67,(0,1):45,(1,0):98,(1,1):70'])
df['(0,0)'] = df['col1'].str.extract(r'\(0,0\):(\d+)', expand=False).fillna(0)
df['(0,1)'] = df['col1'].str.extract(r'\(0,1\):(\d+)', expand=False).fillna(0)
df['(1,0)'] = df['col1'].str.extract(r'\(1,0\):(\d+)', expand=False).fillna(0)
df['(1,1)'] = df['col1'].str.extract(r'\(1,1\):(\d+)', expand=False).fillna(0)
df = df.drop(columns = ['col1'])

输出:

>>> df
  (0,0) (0,1) (1,0) (1,1)
0    19     0     0   155
1    13    32     0    34
2    56     0    43    38
3    67    45    98    70

【讨论】:

感谢您的回复!我也想过用这种单独的方式来做! @KunFang 当您的数据不那么规则时最方便。此外,如果有的话,您可以稍后将其调整为更复杂的情况。请注意,Quang 的代码对我有用。 理解~很奇怪,我在真实数据中尝试过,但显示如下错误:File "pandas/_libs/hashtable_class_helper.pxi", line 811, in pandas._libs.hashtable.Int64HashTable.get_item文件“pandas/_libs/hashtable_class_helper.pxi”,第 817 行,在 pandas._libs.hashtable.Int64HashTable.get_item KeyError: 1 @KunFang 那我说你贴的数据太简单了。 我错了,我输入了'.'当我输入 (',\s*(?![^()]*))',expand=True) 而不是 ',' 时,Quang 方法也有效!【参考方案2】:

我使用双 str.splitstack/unstack 的方法:

(df.col1.str.split(',\s*(?![^()]*\))', expand=True)
   .stack().str.split(':',expand=True)
   .set_index([0], append=True)
   .reset_index(level=1, drop=True)[1]
   .unstack(fill_value=0)
)

输出:

0 (0,0) (0,1) (1,0) (1,1)
0    19     0     0   155
1    13    32     0    34
2    56     0    43    38
3    67    45    98    70

【讨论】:

感谢您的回复!但我收到一条 KeyError: 1 消息。 对不起,我发现一个错字,结果我得到错误...你的方法也有效!再次感谢!

以上是关于如何将列拆分为具有某些功能的多列?的主要内容,如果未能解决你的问题,请参考以下文章

根据三个不同的类别将列拆分为多列-新场景[重复]

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

如何将seaborn图例拆分为多列?

如何有效地将具有一定周期性的列表拆分为多个列表?

Spark SQL一列拆分多列

如何将一列拆分为多列