【问题标题】:Pandas split column into multiple columns by commaPandas 用逗号将列拆分为多列
【发布时间】:2016-10-02 17:07:14
【问题描述】:

我正在尝试根据逗号/空格分隔将一列拆分为多列。

我的数据框目前看起来像

     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)

【问题讨论】:

  • 你想要pd.concat([df[[0]], df[1].str.split(', ', expand=True)], axis=1) IIUC
  • 我知道你是一个显赫的人物,在这里享有很高的声誉,但如果你把它作为官方答案,我会接受。效果很好
  • @Eddwinn EdChum 这样做。确保你至少对他的评论投了赞成票。
  • @Eddwinn 另外,将他的答案发布为您自己给予 EdChum 的功劳。当您在 2 天内选择答案时,您将不会获得代表,这很好。如果其他人在 c'est la vie 之后投票赞成,EdChum 知道他在做什么。
  • 我没有发布答案,因为太晚了,我无法确认这是否是你想要的,有时我也很忙

标签: python pandas csv dataframe split


【解决方案1】:

如果其他人想要将单列(由值分隔)拆分为多列 - 试试这个:

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

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

归功于EdChum's 代码,其中包括将拆分列添加回数据框。

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

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

第二个参数df[1].str.split 是您要拆分的系列。

split Documentation

concat Documentation

【讨论】:

  • 拆分时,我得到了 350 列,其中许多是空白的,是否有任何动态处理拆分的方法?
【解决方案2】:

使用 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)

【讨论】:

    【解决方案3】:

    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 变量拆分为organ 和dimension 两个变量。

    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
    

    基于this answer“如何将一列拆分为两列?”

    【讨论】:

    • 如果警告“FutureWarning:在未来版本中将弃用字符的列迭代。使用 df[['organ', 'dimension']] = df['organ_dimension'].str.split ('_', expand=True)
    • @MarkK 谢谢我更新了答案以使用您建议的分配。
    【解决方案4】:

    使用下面的矢量化效果更好:

    df = df.apply(lambda x:pd.Series(x))
    

    【讨论】:

      【解决方案5】:

      也许这应该可行:

      df = pd.concat([df['KEYS'],df[1].apply(pd.Series)],axis=1)
      

      【讨论】:

        【解决方案6】:

        看看这个

        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()`
        
        

        【讨论】:

          【解决方案7】:

          您可能还想尝试datar,一个包端口dplyr,tidyr 和相关的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
          

          【讨论】:

            猜你喜欢
            • 2021-01-24
            • 2018-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-10
            • 1970-01-01
            • 2023-01-11
            • 2018-07-27
            相关资源
            最近更新 更多