【问题标题】:Create few Data Frames from existing Data Frames based on unique values根据唯一值从现有数据框创建几个数据框
【发布时间】:2021-10-30 19:31:23
【问题描述】:

我的 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 中还有更多独特的价值。

问候 托马斯

【问题讨论】:

  • df[df['b'] == 'Max']]

标签: python pandas dataframe for-loop unique


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    更新

    您是否知道如何使用唯一名称而不是调用 DF: DF_1、DF_2、DF_3?我的意思是 DF_Max、DF_Jon、DF_Anna 并将每个 DF 保存到 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
    

    https://stackoverflow.com/a/68969956/15239951

    https://stackoverflow.com/a/68268034/15239951

    【讨论】:

    • 恕我直言,建议一个非常糟糕的做法,至少我会添加一个警告。这可能会产生意想不到的后果,例如覆盖变量
    • 谢谢伙计!您是否知道如何使用唯一名称调用 DF: DF_1、DF_2、DF_3?我的意思是 DF_Max、DF_Jon、DF_Anna 并将每个 DF 保存到 excel 中?
    • 我根据你的评论更新了我的答案。
    • 你是我今天的英雄兄弟 :D 非常感谢!
    • @Tmiskiewicz 请记住,像这样设置变量是一种非常糟糕的做法,尤其是因为您真的不需要这样做只是为了保存文件
    【解决方案3】:

    您可以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
    

    【讨论】:

    • @mozway。我也这样做了。
    【解决方案4】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2020-11-13
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 2021-09-08
      相关资源
      最近更新 更多