【问题标题】:Problems while spliting pandas dataframe row?拆分熊猫数据框行时出现问题?
【发布时间】:2016-12-20 14:34:37
【问题描述】:

我有以下熊猫数据框:

在:

df

出来:

         A    B        C                                             D
0  0938320  usa   amazon              orange: $ 8.00| pineapple: $2.00
1  0938320  usa  alibaba                  orange: $ 8.00| apple: $2.00
2  0938320  usa     ebay  mint: $ 8.00| watermelon: $2.00| mint: $2.00
...
n  0938320  usa   amazon                  pear: $ 8.00| bannana: $2.00

我想按|拆分,并堆成(*):

         A    B        C                  D
0  0938320  usa   amazon     orange: $ 8.00
1  0938320  usa   amazon   pineapple: $2.00
2  0938320  usa  alibaba     orange: $ 8.00
3  0938320  usa  alibaba       apple: $2.00
4  0938320  usa      bay       mint: $ 8.00
5  0938320  usa     ebay  watermelon: $2.00
6  0938320  usa     ebay        mint: $2.00
7  0938320  usa   amazon       pear: $ 8.00
...
8  0938320  usa   amazon     bannana: $2.00

所以,我尝试了以下方法:

在:

s = df2.D.str.split("|").apply(pd.Series, 1).stack()
s.index = s.index.droplevel(-1)
del df2['D']
df.join(s)

出来:

ValueError: Other Series must have a name

还有:

b = pd.DataFrame(df2.D.str.split('|').tolist(), index=df2['A','B','C']).stack()
b = b.reset_index()[[0, 'D']] 
b.columns = ['A','B','C']
b

但是,不起作用。如何修改最后一种方法以获得 (*)?我想我的主要问题是我不知道如何获取index=df2['A','B','C']).stack() 中的所有列。

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您可以先将 3 列设置为 DF 的索引,然后对第四列 D 进行拆分。使用str.split 中的expand=True 参数,让获得的输出采用数据帧的形式。

    In [55]: df
    Out[55]: 
            A     B         C                                              D
    0  938320   usa    amazon               orange: $ 8.00| pineapple: $2.00
    1  938320   usa   alibaba                   orange: $ 8.00| apple: $2.00
    2  938320   usa      ebay   mint: $ 8.00| watermelon: $2.00| mint: $2.00
    
    In [56]: df_split = df.set_index(['A', 'B', 'C'])['D'].str.split('|', expand=True)
    
    In [57]: df_split
    Out[57]: 
                                        0                   1             2
    A      B    C                                                          
    938320  usa  amazon    orange: $ 8.00    pineapple: $2.00          None
                 alibaba   orange: $ 8.00        apple: $2.00          None
                 ebay        mint: $ 8.00   watermelon: $2.00   mint: $2.00
    

    然后,stack 他们获得一个完整的列(默认删除NaNs),然后使用reset_index 重新排列它。

    In [58]: df_split.stack().reset_index(level=[0,1,2], name='D').reset_index(drop=True)
    Out[58]: 
            A     B         C                   D
    0  938320   usa    amazon      orange: $ 8.00
    1  938320   usa    amazon    pineapple: $2.00
    2  938320   usa   alibaba      orange: $ 8.00
    3  938320   usa   alibaba        apple: $2.00
    4  938320   usa      ebay        mint: $ 8.00
    5  938320   usa      ebay   watermelon: $2.00
    6  938320   usa      ebay         mint: $2.00
    

    【讨论】:

      【解决方案2】:

      这是使用join 组合拆分数据的替代方法。

      # split D and get it into long/stacked format
      productsLong = pd.DataFrame({'products':
                      df['D'].str.split('|', expand=True).stack().reset_index(level=1, drop=True)})
      
      # join the data together on the indices
      df[['A', 'B', 'C']].join(productsLong)
      
      Out[56]: 
              A    B        C            products
      0  938320  usa   amazon      orange: $ 8.00
      0  938320  usa   amazon    pineapple: $2.00
      1  938320  usa  alibaba      orange: $ 8.00
      1  938320  usa  alibaba        apple: $2.00
      2  938320  usa     ebay        mint: $ 8.00
      2  938320  usa     ebay   watermelon: $2.00
      2  938320  usa     ebay         mint: $2.00
      3  938320  usa   amazon        pear: $ 8.00
      3  938320  usa   amazon      bannana: $2.00
      

      备注
      rename 方法返回错误,因此我将 Series 转换为 DataFrame 以提供列名。 reset_index 与 levels=1 删除“外部”索引,保留原始 DataFrame 的索引(为连接操作正确重复)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 2013-06-23
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 2013-07-08
        • 2017-05-08
        相关资源
        最近更新 更多