Skip to main content
 首页 » 编程设计

python之根据索引对 Pandas DataFrame 行进行分组

2025年05月04日15落叶无声

我有一个 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'>