根据唯一值从现有数据框创建少量数据框

Create few Data Frames from existing Data Frames based on unique values

我的 DF 如下所示

x  y  z  b
1  2  3  Max
12 32 8  Max
1  2  3  Jon
12 32 8  Max
1  25  3  Jon
12 32 81  Anna

所以我需要基于 b 列,采用唯一值(在本例中为:Max、Jon、Anna)并创建 3 个新的 df,如下所示:

df_1:

x  y  z  b
1  2  3  Max
12 32 8  Max
12 32 8  Max

df_2:

x  y  z   b
1  2  3   Jon
1  25  3  Jon

df_3:

x  y  z   b
12 32 81  Anna

我一直在寻找答案,但我不知道如何创建新的 DF。你有什么想法?当然在原始DF中有更多的独特价值。

问候 托马斯

试试这个:

>>> Anna, Jon, Max = list(zip(*df.groupby('b')))[1]

或者:

>>> Anna, Jon, Max = [x for _, x in df.groupby('b')]
>>> Anna
    x   y   z     b
5  12  32  81  Anna
>>> Jon
   x   y  z    b
2  1   2  3  Jon
4  1  25  3  Jon
>>> Max
    x   y  z    b
0   1   2  3  Max
1  12  32  8  Max
3  12  32  8  Max
>>> 

您可以 groupby('b') 并制作字典:

dfs = {k:v for k,v in df.groupby('b')}

这是一种保存任意键的有效结构。特别是如果你事先不知道组数。

然后您可以通过按键访问数据帧:

>>> dfs['Max']
    x   y  z    b
0   1   2  3  Max
1  12  32  8  Max
3  12  32  8  Max

使用locals()动态创建变量:

更新

Do you have maybe idea how instead of calling DF: DF_1, DF_2, DF_3 using unique names? I mean DF_Max, DF_Jon, DF_Anna and save every DF into excel?

for name, subdf in df.groupby('b', sort=False):
    locals()[f'df_{name}'] = subdf
    subdf.to_excel(f'{name}.xlsx', index=False)
>>> df_Max
    x   y  z    b
0   1   2  3  Max
1  12  32  8  Max
3  12  32  8  Max


>>> df_Jon
   x   y  z    b
2  1   2  3  Jon
4  1  25  3  Jon


>>> df_Anna
    x   y   z     b
5  12  32  81  Anna

旧答案

for i, (_, subdf) in enumerate(df.groupby('b', sort=False), 1):
    locals()[f'df_{i}'] = subdf
>>> df_1
    x   y  z    b
0   1   2  3  Max
1  12  32  8  Max
3  12  32  8  Max

>>> df_2
   x   y  z    b
2  1   2  3  Jon
4  1  25  3  Jon

>>> df_3
    x   y   z     b
5  12  32  81  Anna

df = pd.DataFrame({'X': [1,12,1,12,1,12],
                   'Y': [2,32,2,32,25,32],
                   'Z': [3,8,3,8,3,81],
                   'B': ["Max","Max","Jon","Max","Jon","Anna"]})
gb = df.groupby('B')
out = {}
for name, group in gb:
   out[name] = group
print(out['Max'])
# Output
    X   Y   Z   B
0   1   2   3   Max
1   12  32  8   Max
3   12  32  8   Max

方法二

out = dict(tuple(df.groupby('B')))

编辑

你也可以试试vars() or globals()

import pandas as pd
df = pd.DataFrame({'X': [1,12,1,12,1,12],
                   'Y': [2,32,2,32,25,32],
                   'Z': [3,8,3,8,3,81],
                   'B': ["Max","Max","Jon","Max","Jon","Anna"]})
for name, group in df.groupby('B'):
    vars()[f"DF_{name}"] = group