我有一个 Pandas DataFrame,我正在尝试根据列值对行进行分组,并将一些行合并到列表中。请允许我详细说明:
我拥有的 DataFrame 如下所示:
industry index entities
cars 0 ['Norway', 'it']
cars 0 ['Mercedes', 'they']
cars 0 ['it', 'EV', 'its']
nature 1 ['fox', 'it']
nature 1 ['them', 'rabbits']
nature 2 ['whale', 'it']
所需的 DataFrame 应如下所示:
industry index entities
cars 0 [ ['Norway', 'it'], ['Mercedes', 'they'], ['it', 'EV', 'its'] ]
nature 1 [ ['fox', 'it'], ['them', 'rabbits'] ]
nature 2 ['whale', 'it']
我主要是尝试根据行业和索引对行进行分组,同时将 entities 列的值合并到列表中。
我做过这样的尝试
df.groupby('industry')['index'].apply(list)
但他们给了我完全不同的结果。
我怎样才能完成我想要的?谢谢。
请您参考如下方法:
您需要在 groupby 之后将 index 更改为 entities 以处理列 entities 并按 分组list - groupby 语句中的 ['industry', 'index']:
df = df.groupby(['industry', 'index'])['entities'].apply(list).reset_index()
print (df)
industry index entities
0 cars 0 [[Norway, it], [Mercedes, they], [it, EV, its]]
1 nature 1 [[fox, it], [them, rabbits]]
2 nature 2 [[whale, it]]
如果需要最后一个值不在嵌套列表中,因为每组只有一个值,可以通过 if-else 和 lambda 函数:
df1 = (df.groupby(['industry', 'index'])['entities']
.apply(lambda x: x.tolist() if len(x) != 1 else x.iat[0])
.reset_index())
print (df1)
industry index entities
0 cars 0 [[Norway, it], [Mercedes, they], [it, EV, its]]
1 nature 1 [[fox, it], [them, rabbits]]
2 nature 2 [whale, it]
编辑:
如果 entities 列中的只是列表的字符串表示,您可以在上述解决方案之前通过 ast 模块将值转换为列表:
print (type(df['entities'].iat[0]))
<class 'str'>
import ast
df['entities'] = df['entities'].apply(ast.literal_eval)
print (type(df['entities'].iat[0]))
<class 'list'>
