熊猫拆分列表列

时间:2019-06-29 15:10:16

标签: python pandas dataframe

我试图在groupby之后将包含值列表的列拆分为多个列。我想通过基于索引位置添加列而不是创建一个新的单独的数据框来动态地做到这一点。

下面的代码集使用自定义函数fnpercentiles来生成数据并创建groupby对象和列列表

import pandas as pd

#DATA
df = pd.DataFrame(data=
    {'ticker': ['AAPL','AAPL','AAPL','IBM','IBM','IBM'],
       'side': ['B','B','S','S','S','B'],
       'size': [100, 200, 300, 400, 100, 200],
      'price': [10.12, 10.13, 10.14, 20.3, 20.2, 20.1]})

#FUNCTION
def fnpercentiles(a):
    return [np.percentile(a, 0.25), np.percentile(a, 0.75)]

g = df.groupby(['ticker', 'side'])

#OPERATION
g12=pd.DataFrame()
g12['price/mean'] = g['size'].mean()/g['price'].sum()
g12['fn-cust'] = g['price'].agg([fnpercentiles])

我可以通过拆分列来生成新的数据框(请参见下面的代码)

h12 = pd.DataFrame(g12['fn-cust'].tolist())

但是我想将列表中的各个列直接插入到已经生成的数据框中。我尝试了以下代码和一些变体

#doesn't work
g12['list_col1'] = g['price'].agg([fnpercentiles]).tolist()[0]

一种解决方法是先将列表拆分为新的数据框,然后再插入其他列。但是如果没有这种技巧,是否有办法实现我想要的?

1 个答案:

答案 0 :(得分:1)

您可以使用列表推导来实现:

g12['list_col1'] = [x[0] for x in g12['fn-cust'].tolist()]
g12['list_col2'] = [x[1] for x in g12['fn-cust'].tolist()] 

您甚至可以使用zip功能在一行中完成此操作:

g12['list_col1'], g12['list_col2'] = zip(*g12['fn-cust'].tolist())

输出:

             price/mean                 fn-cust  list_col1  list_col2
ticker side                                                          
AAPL   B       7.407407  [10.120025, 10.120075]  10.120025  10.120075
       S      29.585799          [10.14, 10.14]  10.140000  10.140000
IBM    B       9.950249            [20.1, 20.1]  20.100000  20.100000
       S       6.172840    [20.20025, 20.20075]  20.200250  20.200750