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



请考虑以下数据帧:

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 出现特殊行为。

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

因为从像字符串一样保存的文件中读取列表,所以有必要将它们转换为带有if-else语句ast.literal_eval的 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]  

最新更新