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

时间:2017-06-23 13:17:21

标签: python pandas

我有一个包含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的数据帧作为数据帧结果,但跳过其余部分。

我该如何解决这个问题?

3 个答案:

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

使用Python Dictionary Comprehension

使用.groupby

df_names = {k: v for (k, v) in df.groupby('customer name')}
  • 这来自与rafaelc的对话,后者指出使用.groupby.unique更快。
    • 该列中有6个唯一值,.groupby的速度更快,与392毫秒相比,为104毫秒
    • 该列中有26个唯一值,.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

下有更好的解释