除了获取DataFrame的子集之外,还有其他更快的选择吗?

时间:2018-09-26 05:49:00

标签: python pandas loops dataframe

我目前正在处理一些Python代码,在其中尝试检索DataFrame的一个子集,其中列值等于某个值。我这样做是这样的:

for i in brands.index:
    current_brand = brands.get_value(i, 'Car Brand')
    my_dataframe_subset = my_dataframe[my_dataframe['Brand'] == current_brand]  

这当然可以制作子集,但是我不断地循环执行数千次。我发现这是我执行速度的巨大瓶颈,但是不幸的是,“ current_brand”会在循环的每次迭代中更改,因此我看不到其他方法。是否有更快的替代方法来获得不会导致如此大延迟的子集?

谢谢

编辑: 这是我的代码正在做的一个更实际的示例。显然数据是乱码,但我希望你能想到:

------------------------
|Person | Car Brand |
|------------------------
|'dave' | 'Toyota'  |
|'mike' | 'Ford'    |
|'sally'| 'Ford'    |
|'doug' | 'BMW'     |
------------------------
my_list = []
for i in brands.index:
    current_person = brands.get_value(i, 'Person')
    current_brand = brands.get_value(i, 'Car Brand')
    my_dataframe_subset = my_dataframe[my_dataframe['Brand'] == current_brand] 

    for i_b in my_dataframe_subset.index:
        #do stuff with current_person and current_brand
        car_colour = my_dataframe_subset(i_b, 'Colour')
        car_speed = my_dataframe_subset(i_b, 'Speeds')
        my_dict = {'person': current_person, 'brand': current_brand, 'colour': car_colour, 'speed': car_speed}
        my_list.append(my_dict)

3 个答案:

答案 0 :(得分:1)

我认为需要merge和默认内部联接:

brands = pd.DataFrame({
        'Person': ['dave', 'mike', 'sall', 'doug'], 
        'Car Brand': ['Kia', 'Ford', 'Ford', 'BMW']
})

my_dataframe = pd.DataFrame({
        'Brand':['Toyota','Toyota','BMW', 'BMW', 'BMW', 'Ford'],
         'Speeds':[40,50,20,10,30,40],
         'Colour':list('abcdef')
})
print (my_dataframe)
    Brand  Speeds Colour
0  Toyota      40      a
1  Toyota      50      b
2     BMW      20      c
3     BMW      10      d
4     BMW      30      e
5    Ford      40      f

d = {'Car Brand':'Brand'}
df = brands.rename(columns=d).merge(my_dataframe, on='Brand')
print (df)
  Person Brand  Speeds Colour
0   mike  Ford      40      f
1   sall  Ford      40      f
2   doug   BMW      20      c
3   doug   BMW      10      d
4   doug   BMW      30      e

如果需要词典列表:

my_list = df.to_dict(orient='records')

答案 1 :(得分:1)

1)遍历brands数据框中的所有唯一品牌。

2)过滤my_dataframe数据框中与品牌匹配的行。

根据您要如何处理空集(即,当brand中没有my_dataframe中的brandsBrand中的空集相匹配时),您可以按{{1} } my_dataframe中的},如@jezrael和@chthonicdaemon所示。

for current_brand in brands['Car Brand'].unique():
    brand_df = my_dataframe[my_dataframe['Brand'] == current_brand]
    # Do stuff with filtered brand dataframe.

答案 2 :(得分:0)

让我们从一些示例数据开始:

import pandas
brands = pandas.DataFrame({'Car Brand': ['Toyota', 'Honda']})
my_dataframe = pandas.DataFrame({'Brand': ['Toyota']*4 + ['Honda']*4, 'Value': [1]*8})

对于此数据的情况,brands数据帧仅在my_dataframe.Brand列中包含唯一值。在这种情况下,您可以直接使用groupby

for current_brand, my_dataframe_subset in my_dataframe.groupby('Brand'):
    # do stuff with subset

如果brands中的品牌少于my_dataframe中的品牌,则可以过滤掉它们:

dataset_for_brands = my_dataframe[my_dataframe.Brand.isin(brands['Car Brand'])]
for current_brand, my_dataframe_subset in dataset_for_brands.groupby('Brand'):
    # do stuff with subset

如果您正在计算组的汇总,甚至有可能完全避免循环,所以假设您希望每个组的平均值都可以

my_dataframe.groupby('Brand').Value.mean()

直接获得答案:

Brand
Honda     1
Toyota    1