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')