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

ylc*_*nky 2 python pandas

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

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

['Name1', 'Name2', 'Name3, 'Name4']
Run Code Online (Sandbox Code Playgroud)

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

for x in customerNames:
    x = DataFrame.loc[DataFrame['customer name'] == x]
x
Run Code Online (Sandbox Code Playgroud)

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

我怎么解决这个问题?

Tre*_*ney 9

要为列中的所有唯一值创建数据框,请创建一个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
Run Code Online (Sandbox Code Playgroud)

使用Python 字典理解

使用.groupby

df_names = {k: v for (k, v) in df.groupby('customer name')}
Run Code Online (Sandbox Code Playgroud)
  • 这来自与rafaelc的对话,他指出 using.groupby.unique.
    • 列中有 6 个唯一值,.groupby速度更快,为 104 毫秒,比 392 毫秒更快
    • 列中有 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()}
Run Code Online (Sandbox Code Playgroud)

测试

  • 以下数据用于测试
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)
Run Code Online (Sandbox Code Playgroud)


jac*_*k6e 7

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

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

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

df_dict['Name3']
Run Code Online (Sandbox Code Playgroud)