具有项目列表的列的pandas groupby聚合返回字符串而不是列表

时间:2019-09-24 07:25:03

标签: python python-3.x pandas dataframe

请考虑以下数据框:

sample_DF.tsv

我想按此数据框分组,因此我应用了以下逻辑:

df = pd.read_csv('sample_DF.tsv',sep='\t')

df.groupby('col3',as_index=False).aggregate(lambda x:list(x)).reset_index(drop=True)

但是输出不会将列表作为第4列和第5列的列表加入列表。

当我尝试使用虚拟数据框进行相同操作时,

df = pd.DataFrame({'P':[['a','b','c'],['x','y'],[1,2,3],['a','b','c'],['x','y']],'Q':['tom','dick','harry','tom','dick'],'R':[10,12,15,10,12]})

df.groupby('R',as_index=False).aggregate(lambda x:list(x))

我得到了期望的结果,其中返回了列P和Q的列表。

这意味着sample_DF.tsv数据有些特殊之处,导致我的命令pandas.groupby出现特殊行为。

请让我知道可能是什么原因。

1 个答案:

答案 0 :(得分:1)

因为要从保存为字符串的文件中读取列表,所以必须使用ast.literal_eval语句和if-else将它们转换为python对象列表:

import ast

df = pd.read_csv('sample_DF.tsv', sep="\t", index_col=None, parse_dates=False)

cols = ['TFactor','miRNA']
df[cols] = df[cols].applymap(lambda x: ast.literal_eval(x) if str(x).startswith('[') else [x])
print (df)

    Gene stable ID   Genes  Chromo community                TFactor  \
0  ENSG00000148584    A1CF      10      com2                  [INV]   
1  ENSG00000175899     A2M      12      com1  [STAT3, TFCP2, NFKB1]   
2  ENSG00000166535   A2ML1      12      com9                  [INV]   
3  ENSG00000128274  A4GALT      22      com4                  [INV]   
4  ENSG00000081760    AACS      12      com3                  [INV]   

                                               miRNA  
0  [miR-374-5p/655-3p, miR-758, miR-374c-5p, miR-...  
1                                              [INV]  
2                                              [INV]  
3                                              [INV]  
4                              [miR-137-3p, miR-137]