我有这样的数据帧:
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
抱怨说,由于显而易见的原因,它不能清洗。
这应该可以解决问题
df.set_index(['user', 'report']).groupIDs.apply(pd.Series).stack().reset_index(['user', 'report'], name='groupIDs')
这是一种方法。这需要几行,但构建新的数据帧通常更有效。
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