我有一个包含 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作为数据帧结果返回了数据帧,但跳过了其余部分。
我怎么解决这个问题?
要为列中的所有唯一值创建数据框,请创建一个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)
.groupbydf_names = {k: v for (k, v) in df.groupby('customer name')}
Run Code Online (Sandbox Code Playgroud)
.groupby比.unique.
.groupby速度更快,为 104 毫秒,比 392 毫秒更快.groupby速度更快,为 147 毫秒,而需要 1.53 秒。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)
您当前的迭代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)
| 归档时间: |
|
| 查看次数: |
16225 次 |
| 最近记录: |