在熊猫中按不规则组划分数据帧

时间:2019-06-13 06:59:25

标签: python pandas dataframe

我有一个数据框,例如:

 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上阅读了很多类似的文章,但都没有解决这个问题。

也许有人有个好主意吗?

1 个答案:

答案 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