请考虑以下数据框:
我想按此数据框分组,因此我应用了以下逻辑:
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出现特殊行为。
请让我知道可能是什么原因。
答案 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]