根据唯一值从现有数据框创建少量数据框
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