将每 x 个唯一值的 DataFrame 拆分为新的 DataFrame

Split DataFrame every x unique values into new Dataframes

为了可视化,我需要按每个 x 唯一值对长格式 DataFrame 进行切片。我的实际数据集有 20 个个体的 90 个变量,所以我想分成 9 个单独的 df,每个变量包含所有 20 个个体的条目。

我创建了这个简单的示例来帮助解释:

df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3,3,4,4,4],
                'Period':[1,2,3,1,2,3,1,2,3,1,2,3,],
                'Food':['Ham','Ham','Ham','Cheese','Cheese','Cheese','Egg','Egg','Egg','Bacon','Bacon','Bacon',]})
df

''' ******* PSUEDOCODE *******
    df1 = unique entries [:2]
    df2 = unique entries [2:4] '''


# desired outcome:

df1 = pd.DataFrame({'ID':[1,1,1,2,2,2,],
                'Period':[1,2,3,1,2,3,],
                'Food':['Ham','Ham','Ham','Cheese','Cheese','Cheese',]})

df2 = pd.DataFrame({'ID':[3,3,3,4,4,4],
                'Period':[1,2,3,1,2,3,],
                'Food':['Egg','Egg','Egg','Bacon','Bacon','Bacon',]})

print(df1)
print(df2)

在这种情况下,DataFrame 将在 df['Food'] 列中每 2 组唯一条目的末尾拆分,以创建 df1df2。最好的情况是一个循环,为每个 x 个唯一条目创建一个新的 DataFrame。由于缺乏我能找到的信息,不幸的是,我正在努力为此编写甚至好的伪代码。

让我们试试 factorizegroupby

n = 2
d = {x : y for x , y in df.groupby(df.Food.factorize()[0]//n)}
d[0]
Out[132]: 
   ID  Period    Food
0   1       1     Ham
1   1       2     Ham
2   1       3     Ham
3   2       1  Cheese
4   2       2  Cheese
5   2       3  Cheese
d[1]
Out[133]: 
    ID  Period   Food
6    3       1    Egg
7    3       2    Egg
8    3       3    Egg
9    4       1  Bacon
10   4       2  Bacon
11   4       3  Bacon

我们可以使用groupby + ngroup + floordiv来创建组;然后用另一个groupby分隔:

out = [x for _, x in df.groupby(df.groupby('Food', sort=False).ngroup().floordiv(2))]

输出:

[   ID  Period    Food
0   1       1     Ham
1   1       2     Ham
2   1       3     Ham
3   2       1  Cheese
4   2       2  Cheese
5   2       3  Cheese,

    ID  Period   Food
6    3       1    Egg
7    3       2    Egg
8    3       3    Egg
9    4       1  Bacon
10   4       2  Bacon
11   4       3  Bacon]

可能的解决方案如下:

# pip install pandas

import pandas as pd

df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3,3,4,4,4],
                'Period':[1,2,3,1,2,3,1,2,3,1,2,3,],
                'Food':['Ham','Ham','Ham','Cheese','Cheese','Cheese','Egg','Egg','Egg','Bacon','Bacon','Bacon',]})

dfs = [y for x, y in df.groupby('Food', as_index=False)]

分离的 dfs 可以通过列表索引(见下文)或使用循环访问:

dfs[0]

dfs[1]

and etc.

据我了解,这可能会有所帮助:

for x in df['ID'].unique():
    print(df[df['ID']==x], '\n')
for x in df['Food'].unique():
    print(df[df['Food']==x], '\n')