我有一个包含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
的数据帧作为数据帧结果,但跳过其余部分。
我该如何解决这个问题?
答案 0 :(得分:3)
您当前的迭代每次运行时都会覆盖x
两次:for
循环将客户名称分配给x
,然后为其分配数据框。
为了能够稍后按名称调用每个数据帧,请尝试将它们存储在字典中:
df_dict = {name: df.loc[df['customer name'] == name] for name in customerNames}
df_dict['Name3']
答案 1 :(得分:1)
要为一列中的所有唯一值创建一个数据框,请创建一个dict
数据框,如下所示。
dict
,其中每个键是所选列中的唯一值,而该值是一个数据框。df_names['Name1']
).groupby()
创建一个generator,可以将其解压缩。
k
是该列中的唯一值,v
是与每个k
相关的数据。for-loop
和.groupby
:df_names = dict()
for k, v in df.groupby('customer name'):
df_names[k] = v
.groupby
df_names = {k: v for (k, v) in df.groupby('customer name')}
.groupby
比.unique
更快。
.groupby
的速度更快,与392毫秒相比,为104毫秒.groupby
的速度更快,从1.53 s到147 ms。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)
答案 2 :(得分:0)
也许我弄错了,但是
当
for x in customerNames:
x = DataFrame.loc[DataFrame['customer name'] == x]
x
为最后一个列表条目提供正确的输出,因为你的输出超出了循环的缩进
import pandas as pd
customer_df = pd.DataFrame.from_items([('A', ['Jean', 'France']), ('B', ['James', 'USA'])],
orient='index', columns=['customer', 'country'])
customer_list = ['James', 'Jean']
for x in customer_list:
x = customer_df.loc[customer_df['customer'] == x]
print(x)
print('now I could append the data to something new')
你得到了输出:
customer country
B James USA
now I could append the data to something new
customer country
A Jean France
now I could append the data to something new
或者,如果你不喜欢循环,你可以选择
import pandas as pd
customer_df = pd.DataFrame.from_items([('A', ['Jean', 'France']), ('B', ['James', 'USA']),('C', ['Hans', 'Germany'])],
orient='index', columns=['customer', 'country'])
customer_list = ['James', 'Jean']
print(customer_df[customer_df['customer'].isin(customer_list)])
输出:
customer country
A Jean France
B James USA
df.isin在How to implement 'in' and 'not in' for Pandas dataframe
下有更好的解释