我目前正在处理一些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)
答案 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
中的brands
与Brand
中的空集相匹配时),您可以按{{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