将列表分成多行(pandas)的“Splat”行

问题描述 投票:2回答:2

我有这样的数据帧:

user    groupIDs                report
user2   [31501, 31502, 31503]   blogpost
jim     [31501, 31502, 31503]   book
jane    [31600]                 article
jim     [31501, 31502, 31503]   book
peter   [31501, 31502, 31503]   blogpost
user1   [31501, 31502]          blogpost
user1   [31501, 31502]          blogpost
john    [31600]                 tweet

groupIDs列包含整数列表。

我需要将此数据帧转换为:

user    groupIDs    report
user2   31501       blogpost
user2   31502       blogpost
user2   31503       blogpost
jim     31501       book
jim     31502       book
jim     31503       book
jane    31600       article
...

也就是说,将具有多个ID的每一行转换为该行副本的列表,每个副本都包含原始列表中的一个ID。

使用此专栏的groupby抱怨说,由于显而易见的原因,它不能清洗。

python pandas
2个回答
2
投票

这应该可以解决问题

df.set_index(['user', 'report']).groupIDs.apply(pd.Series).stack().reset_index(['user', 'report'], name='groupIDs')

1
投票

这是一种方法。这需要几行,但构建新的数据帧通常更有效。

from itertools import chain

df = pd.DataFrame([['user2', [31501, 31502, 31503], 'blogpost']],
                  columns=['user', 'groupIDs', 'report'])

lens = list(map(len, df['groupIDs']))

df_out = pd.DataFrame({'user': np.repeat(df['user'].values, lens),
                       'groupIDs': list(chain.from_iterable(df['groupIDs'].values)),
                       'report': np.repeat(df['report'].values, lens)})

#    groupIDs    report   user
# 0     31501  blogpost  user2
# 1     31502  blogpost  user2
# 2     31503  blogpost  user2
© www.soinside.com 2019 - 2024. All rights reserved.