拆分列表列

2024-09-29 09:38:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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]

解决方法是首先将列表拆分为新的数据帧,然后插入其他列。但是,有没有办法实现我想要的没有这个黑客?你知道吗


Tags: 数据代码dataframedf列表sizeibmprice
1条回答
网友
1楼 · 发布于 2024-09-29 09:38:40

您可以使用列表理解:

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

相关问题 更多 >