【问题标题】:how to convert a data frame with a list in the value to a big data frame with the each level as a single column value in python?python - 如何将值中包含列表的数据框转换为每个级别作为python中的单列值的大数据框?
【发布时间】:2016-02-09 16:43:33
【问题描述】:

我有一个如下所示的数据框:

mydata = [{'col_A' : 'A', 'col_B': [1,2,3]},
      {'col_A' : 'B', 'col_B': [7,8]}]
pd.DataFrame(mydata)


col_A   col_B
    A   [1, 2, 3]
    B   [7, 8]

如何拆分列表中的值并创建如下所示的数据框:

col_A   col_B
A   1
A   2
A   3
B   7
B   8

【问题讨论】:

  • 请考虑以下有效答案之一以结束主题。

标签: python pandas


【解决方案1】:

试试这个:

pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} 
               for ind, row in df.iterrows()
               for val in row['col_B']])

您也许还可以使用 apply() 函数做一些聪明的事情,但在我脑海中,我能想到如何做。

【讨论】:

    【解决方案2】:

    这是使用apply的解决方案:

    df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index(level=0)
    
      col_A  0
    0     A  1
    1     A  2
    2     A  3
    3     B  7
    4     B  8
    

    【讨论】:

      【解决方案3】:

      如果你的DataFrame 很大,最快的方法是使用DataFrame constructorstack 和双reset_index

      print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack()
                         .reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})
      

      测试

      import pandas as pd
      
      mydata = [{'col_A' : 'A', 'col_B': [1,2,3]},
            {'col_A' : 'B', 'col_B': [7,8]}]
      df = pd.DataFrame(mydata)
      
      print df
      
      
      df =  pd.concat([df]*1000).reset_index(drop=True)
      
      print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})
      
      print pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
      
      print df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
      
      print pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
      

      时机

      In [1657]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
      100 loops, best of 3: 4.01 ms per loop
      
      In [1658]: %timeit pd.DataFrame(x for x in df['col_B']).set_index(df['col_A']).stack().reset_index(drop=True, level=1).reset_index().rename(columns={0:'col_B'})
      100 loops, best of 3: 3.09 ms per loop
      
      In [1659]: %timeit pd.DataFrame([{'col_A':row['col_A'], 'col_B':val} for ind, row in df.iterrows() for val in row['col_B']])
      10 loops, best of 3: 153 ms per loop
      
      In [1660]: %timeit df['col_B'].apply(pd.Series).set_index(df['col_A']).stack().reset_index().drop('level_1', axis=1).rename(columns={0:'col_B'})
      1 loops, best of 3: 357 ms per loop
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多