请考虑以下数据帧:
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]