从一列中的唯一值创建 Pandas DataFrames

新手上路,请多包涵

我有一个包含 1000 行的 Pandas 数据框。它有 Names 列包括客户名称及其记录。我想根据每个客户的唯一名称为他们创建单独的数据框。我将唯一名称放入列表中

customerNames = DataFrame['customer name'].unique().tolist() 这给出了以下数组

['Name1', 'Name2', 'Name3, 'Name4']

我通过捕获上面列表中的唯一名称并为每个名称创建数据帧并将数据帧分配给客户名称来尝试循环。因此,例如当我写 Name3 时,它应该将 Name3 的数据作为单独的数据帧

for x in customerNames:
    x = DataFrame.loc[DataFrame['customer name'] == x]
x

上面几行只返回数据帧 Name4 作为数据帧结果,但跳过了其余部分。

我怎么解决这个问题?

原文由 ylcnky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 478
2 个回答

您当前的迭代每次运行时都会覆盖 x 两次: for 循环将客户名称分配给 x 循环分配一个客户名称,然后您将其分配给数据帧

为了能够稍后通过名称调用每个数据帧,请尝试将它们存储在字典中:

 df_dict = {name: df.loc[df['customer name'] == name] for name in customerNames}

df_dict['Name3']

原文由 jack6e 发布,翻译遵循 CC BY-SA 3.0 许可协议

要为列中的所有唯一值创建一个数据框,请创建一个 dict 数据框,如下所示。

  • 创建一个 dict ,其中每个键都是来自所选列的唯一值,该值是一个数据框。
  • 像访问标准字典一样访问每个数据框(例如 df_names['Name1']
  • .groupby() 创建一个可以解压的 生成器
    • k 是列中的唯一值, v 是与每个 k 关联的数据。

使用 for-loop.groupby

 df_names = dict()
for k, v in df.groupby('customer name'):
    df_names[k] = v

使用 Python 字典理解

使用 .groupby

 df_names = {k: v for (k, v) in df.groupby('customer name')}
  • 这来自与 rafaelc 的对话,他指出使用 .groupby.unique 更快。
    • 列中有 6 个唯一值, .groupby 更快,与 392 毫秒相比为 104 毫秒
    • 列中有 26 个唯一值, .groupby 更快,为 147 毫秒,而 1.53 秒。
  • 使用 a for-loop 比推导稍微快一点,特别是对于更独特的列值或大量行(例如 10M)。

使用 .unique

  • 使用 布尔索引 匹配所选列中的唯一值。
    
    df_names = {name: df[df['customer name'] == name] for name in df['customer name'].unique()}
    

测试

  • 以下数据用于测试 “` import pandas as pd import string import random

random.seed(365)

6 unique values

data = {‘class’: [random.choice([‘1-5’, ‘6-25’, ‘26-100’, ‘100-500’, ‘500-1000’, ‘>1000’]) for _ in range(1000000)], ‘treatment’: [random.choice([‘Yes’, ‘No’]) for _ in range(1000000)]}

26 unique values

data = {‘class’: [random.choice( list(string.ascii_lowercase)) for _ in range(1000000)], ‘treatment’: [random.choice([‘Yes’, ‘No’]) for _ in range(1000000)]}

df = pd.DataFrame(data)

”`

原文由 Trenton McKinney 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题