Python 如何在DataFrame列中展开列表?

Python 如何在DataFrame列中展开列表?,python,pandas,Python,Pandas,我有以下数据帧df: center status devices 1 Green [d1, d2] 1 Green [d5, d1, d2] 2 Green [] 3 Green [d5, d6] 我需要展开设备列中的列表。目标是通过中心和设备对数据进行分组,然后计算每组的观察次数 预期结果如下: center device count 1 d1 2 1 d2

我有以下数据帧
df

center    status     devices
1     Green      [d1, d2]
1     Green      [d5, d1, d2]
2     Green      []
3     Green      [d5, d6]
我需要展开
设备
列中的列表。目标是通过
中心
设备
对数据进行分组,然后计算每组的观察次数

预期结果如下:

center   device   count
1        d1       2
1        d2       2
1        d5       1
3        d5       1
3        d6       1

首先展平
列表
s,然后通过以下方式进行聚合:

提高性能的另一个解决方案:

from itertools import chain

df = pd.DataFrame({
    'devices' : list(chain.from_iterable(df['devices'].tolist())), 
    'center' : df['center'].values.repeat(df['devices'].str.len())
})


df = df.groupby(['center','devices']).size().reset_index(name='count')
print (df)
   center devices  count
0       1      d1      2
1       1      d2      2
2       1      d5      1
3       3      d5      1
4       3      d6      1
使用after过滤空列表,然后使用
groupby
size

unnesting(df[df.devices.astype(bool)],['devices']).groupby(['center','devices']).size().reset_index(name='count')
Out[214]: 
   center devices  count
0       1      d1      2
1       1      d2      2
2       1      d5      1
3       3      d5      1
4       3      d6      1


@jezrael是的,你是对的~谢谢你帮助我:-)@jezrael当我注意到有空列表时,我猜op已经排除了
np.nan
,但这只是基于我的假设,这是不可靠的。我在真实数据上尝试了这种方法,但在
center
列中,我只能看到一个值。如果我执行
输出[output[“center”]==2]
,则输出为空。但是如果我做了
df[df[“center”]==2]
,那么我会得到行。您知道为什么会发生这种情况吗?@Tatik-hmmm,这是组
2
的空列表,因此这一行将从输出中的数据中删除。
unnesting(df[df.devices.astype(bool)],['devices']).groupby(['center','devices']).size().reset_index(name='count')
Out[214]: 
   center devices  count
0       1      d1      2
1       1      d2      2
2       1      d5      1
3       3      d5      1
4       3      d6      1
def unnesting(df, explode):
    idx=df.index.repeat(df[explode[0]].str.len())
    df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
    df1.index=idx
    return df1.join(df.drop(explode,1),how='left')