【问题标题】:Python dataframe separate cell values containing listsPython数据框分隔包含列表的单元格值
【发布时间】:2018-09-24 15:02:25
【问题描述】:

我有一个数据框df

        0               1               2   
Mon ['x','y','z']   ['a','b','c']   ['a','b','c']
Tue ['a','b','c']   ['a','b','c']   ['x','y','z']
Wed ['a','b','c']   ['a','b','c']   ['a','b','c']

列表彼此之间都存在差异(也许也相似),我希望将其转换为形式:

    0 1 2
Mon x a a
Mon y b b
Mon z c c
Tue a a x
Tue b b y
Tue c c z
Wed a a a
Wed b b b
Wed c c c

参考之前的一些 SO 问题,Explode lists with different lengths in PandasSplit (explode) pandas dataframe string entry to separate rows

我尝试使用他们的解决方案,但无法获得所需的输出。我怎样才能做到这一点?

s1 = df[0]
s2 = df[1]
s3 = df[2]
i1 = np.arange(len(df)).repeat(s1.str.len())
i2 = np.arange(len(df)).repeat(s2.str.len())
i3 = np.arange(len(df)).repeat(s3.str.len())
df.iloc[i1, :-1].assign(**{'Shared Codes': np.concatenate(s1.values)})
df.iloc[i2, :-1].assign(**{'Shared Codes': np.concatenate(s2.values)})
df.iloc[i3, :-1].assign(**{'Shared Codes': np.concatenate(s3.values)})

另外,如果我有更多的专栏,这似乎不是一个非常合理的方法。使用 python 2.7。

【问题讨论】:

    标签: python python-2.7 pandas numpy dataframe


    【解决方案1】:

    我会这样做:

    dfs = []
    for day in df.index:
        part = pd.DataFrame(df.loc[day].tolist()).T
        part.index = np.repeat(day, len(df.columns))
        dfs.append(part)
    result = pd.concat(dfs)
    

    【讨论】:

      【解决方案2】:

      如果列包含由 3 个元素组成的列表,则简单的迭代可能会有所帮助,即:

      ndf = pd.concat([df.apply(lambda x : [i[j] for i in x],1) for j in range(3)]).sort_index()
      
           0  1  2
      Mon  x  a  a
      Mon  y  b  b
      Mon  z  c  c
      Tue  a  a  x
      Tue  b  b  y
      Tue  c  c  z
      Wed  a  a  a
      Wed  b  b  b
      Wed  c  c  c
      

      【讨论】:

      • 这个解决方案搞乱了数据框和列表的顺序。
      • 当一个数据帧,df 被传递给你的单行代码。 1. 索引的顺序发生变化, 2. 单元格值的顺序(在这种情况下是列表)在分隔时也会发生变化。因此,这不是最有效的解决方案,因为维护列表的顺序很重要。
      【解决方案3】:

      这是使用itertools.chainnumpy.repeat 的一种方式:

      import pandas as pd, numpy as np
      from itertools import chain
      
      df = pd.DataFrame({0: [['x', 'y', 'z'], ['a', 'b', 'c'], ['a', 'b', 'c']],
                         1: [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']],
                         2: [['a', 'b', 'c'], ['x', 'y', 'z'], ['a', 'b', 'c']]},
                        index=['Mon', 'Tue', 'Wed'])
      
      res = pd.DataFrame({k: list(chain.from_iterable(df[k])) for k in df},
                         index=np.repeat(df.index, list(map(len, df[0]))))
      
      print(res)
      
      #      0  1  2
      # Mon  x  a  a
      # Mon  y  b  b
      # Mon  z  c  c
      # Tue  a  a  x
      # Tue  b  b  y
      # Tue  c  c  z
      # Wed  a  a  a
      # Wed  b  b  b
      # Wed  c  c  c
      

      【讨论】:

        猜你喜欢
        • 2020-01-18
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        相关资源
        最近更新 更多