我有一个数据框,例如:
Sample_name Signature Len
A 1 10
A 2 10
B 1 10
B 2 10
B 3 10
C 1 10
D 1 10
D 2 10
D 3 10
D 4 10
E 1 10
E 2 10
F 1 10
F 2 10
F 3 10
F 4 10
G 1 10
因此在该示例DF中,我有7个不同的样本。是A,B,C,D,E,F,G。我需要从此数据框中创建一些较小的对象,但要根据特殊条件。每个新数据帧应包含2个SAMPLE。
因此,在这种情况下,结果应为4个数据帧。首先是A和B的所有记录,其次是C,D;最后一个E,F ..,最后一个,因为样本不足,应该只是G。
预期结果:
新df1:
A 1 10
A 2 10
B 1 10
B 2 10
B 3 10
新df2:
C 1 10
D 1 10
D 2 10
D 3 10
D 4 10
新df3:
E 1 10
E 2 10
F 1 10
F 2 10
F 3 10
F 4 10
新df4:
G 1 10
因此,正如您所看到的,我不能仅将df除以行号,因为每个Sample都有不同的行号。我试图通过for循环来做到这一点,但是它确实很慢并且会抛出错误(内存,键,形状)。 DF有1500万条记录。 84k个样本。 我在SO上阅读了很多类似的文章,但都没有解决这个问题。
也许有人有个好主意吗?
答案 0 :(得分:3)
将factorize
与整数除法用于组并将groupby
对象转换成字典或列表:
print (pd.factorize(df['Sample_name'])[0])
[0 0 1 1 1 2 3 3 3 3 4 4 5 5 5 5 6]
print (pd.factorize(df['Sample_name'])[0] // 2)
[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 3]
#output is dict
dfs = dict(tuple(df.groupby(pd.factorize(df['Sample_name'])[0] // 2)))
#output is list
#dfs = [x for _, x in df.groupby(pd.factorize(df['Sample_name'])[0] // 2)]
print (dfs)
{0: Sample_name Signature Len
0 A 1 10
1 A 2 10
2 B 1 10
3 B 2 10
4 B 3 10, 1: Sample_name Signature Len
5 C 1 10
6 D 1 10
7 D 2 10
8 D 3 10
9 D 4 10, 2: Sample_name Signature Len
10 E 1 10
11 E 2 10
12 F 1 10
13 F 2 10
14 F 3 10
15 F 4 10, 3: Sample_name Signature Len
16 G 1 10}
print (dfs[0])
Sample_name Signature Len
0 A 1 10
1 A 2 10
2 B 1 10
3 B 2 10
4 B 3 10