使用Pandas按逗号将列拆分成多个列

49

我想将一个包含逗号/空格分隔的列拆分成多个列。

我的数据框目前看起来像:

     KEYS                                                  1
0   FIT-4270                                          4000.0439
1   FIT-4269                                          4000.0420, 4000.0471
2   FIT-4268                                          4000.0419
3   FIT-4266                                          4000.0499
4   FIT-4265                                          4000.0490, 4000.0499, 4000.0500, 4000.0504,

我希望

   KEYS                                                  1           2            3        4 
0   FIT-4270                                          4000.0439
1   FIT-4269                                          4000.0420  4000.0471
2   FIT-4268                                          4000.0419
3   FIT-4266                                          4000.0499
4   FIT-4265                                          4000.0490  4000.0499  4000.0500  4000.0504 

我的代码目前删除了KEYS列,但我不确定为什么。有谁可以改进或帮助解决这个问题吗?

v = dfcleancsv[1]

#splits the columns by spaces into new columns but removes KEYS?

dfcleancsv = dfcleancsv[1].str.split(' ').apply(Series, 1)

32
如果我理解正确的话,您想要 pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1) - EdChum
1
我知道你是这里备受关注的重要人物,但如果你将其作为正式答案,我会接受。它非常有效。 - Anekdotin
1
@Eddwinn EdChum 这样做。请确保至少给他的评论点赞。 - piRSquared
2
@Eddwinn,同时将他的答案发布为您自己的答案,并给予EdChum信用。当您在2天内选择它作为答案时,您不会获得声望,这是好事。如果之后其他人投票支持该答案,那就随遇而安吧,EdChum知道自己在做什么。 - piRSquared
1
我没有发布答案,因为当时已经很晚了,而且我无法确认这是否是您想要的,有时候我也非常忙。 - EdChum
9个回答

80

如果有其他人想要将单个列(由一个值分隔)拆分为多个列-请尝试以下方法:

series.str.split(',', expand=True)

这回答了我来到这里寻找的问题。

感谢EdChum的代码,其中包括将分裂的列添加回数据框中。

pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)

注意: 第一个参数 df[[0]] 是一个 DataFrame

第二个参数 df[1].str.split 是你想要分割的序列。

分割文档

连接文档


在拆分时,我得到了350列,其中许多是空白的,有没有处理拆分的动态方式? - SUSHMA KUMARI

12

使用Edchums的答案

pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1)

我通过替换变量,成功地解决了它。

dfcleancsv = pd.concat([dfcleancsv['KEYS'], dfcleancsv[1].str.split(', ', expand=True)], axis=1)

9

这个OP有可变数量的输出列。 在输出列数量固定的情况下,命名结果列的另一个优雅解决方案是使用多重赋值。

载入一个样本数据集并将其转换为长格式以获取一个名为organ_dimension的变量。

import seaborn
iris = seaborn.load_dataset('iris')
df = iris.melt(id_vars='species', var_name='organ_dimension', value_name='value')

根据 _ 分隔符,将 organ_dimension 变量拆分为两个变量 organdimension

df[['organ', 'dimension']] = df['organ_dimension'].str.split('_', expand=True)
df.head()

Out[10]: 
  species organ_dimension  value  organ dimension
0  setosa    sepal_length    5.1  sepal    length
1  setosa    sepal_length    4.9  sepal    length
2  setosa    sepal_length    4.7  sepal    length
3  setosa    sepal_length    4.6  sepal    length
4  setosa    sepal_length    5.0  sepal    length

基于这个答案"如何将一列拆分成两列?"


1
如果出现警告“FutureWarning: Columnar iteration over characters will be deprecated in future releases.. Use df[['organ', 'dimension']] = df['organ_dimension'].str.split('', expand=True)”,请使用df[['organ', 'dimension']] = df['organ_dimension'].str.split('', expand=True)。 - Mark K
1
@MarkK 谢谢,我已经更新了答案,使用了你建议的赋值方式。 - Paul Rougieux

5
使用最简单的方式是矢量化
df = df.apply(lambda x:pd.Series(x))

2
也许这个会起作用:
df = pd.concat([df['KEYS'],df[1].apply(pd.Series)],axis=1)

1

0

您可能还想尝试datar,这是一个将dplyrtidyr和相关的R包移植到Python的软件包:

>>> df
         i       j              A
  <object> <int64>       <object>
0       AR       5    Paris,Green
1      For       3  Moscow,Yellow
2      For       4  NewYork,Black
>>> from datar import f
>>> from datar.tidyr import separate
>>> separate(df, f.A, ['City', 'Color'])
         i       j     City    Color
  <object> <int64> <object> <object>
0       AR       5    Paris    Green
1      For       3   Moscow   Yellow
2      For       4  NewYork    Black

0

看一下这个

Responder_id    LanguagesWorkedWith
0   1   HTML/CSS;Java;JavaScript;Python
1   2   C++;HTML/CSS;Python
2   3   HTML/CSS
3   4   C;C++;C#;Python;SQL
4   5   C++;HTML/CSS;Java;JavaScript;Python;SQL;VBA
... ... ...
87564   88182   HTML/CSS;Java;JavaScript
87565   88212   HTML/CSS;JavaScript;Python
87566   88282   Bash/Shell/PowerShell;Go;HTML/CSS;JavaScript;W...
87567   88377   HTML/CSS;JavaScript;Other(s):
87568   88863   Bash/Shell/PowerShell;HTML/CSS;Java;JavaScript...`
###Split the LanguagesWorkedWith column into  multiple columns  by using` data= data1['LanguagesWorkedWith'].str.split(';').apply(pd.Series)`.###
` data1 = pd.read_csv('data.csv', sep=',')
data1.set_index('Responder_id',inplace=True)
data1
data1.loc[1,:]
data= data1['LanguagesWorkedWith'].str.split(';').apply(pd.Series)
data.head()`


0
对我来说,以下代码似乎可以正常工作:-
new_df = df.assign(colname= df.colname.str.split(',').stack()).explode('colname')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接