【发布时间】:2021-08-20 07:39:12
【问题描述】:
我想消除我的代码中的嵌套循环,但我似乎无法找出最好的方法来做到这一点。 我在下面解释了我想要做的事情:
我有一个数据框 df。
data = [['1A', 'apple', '35-44', 'male', ['apple', 'strawberry', 'pineapple']], ['1B', 'banana', '15-24', 'female', ['apple', 'banana', 'durian']], \
['1C', 'cranberry', '35-44', 'male', ['cranberry', 'apple', 'durian']], ['1D','durian', '15-24', 'female', ['durian', 'kiwi', 'banana']], \
['1E', 'elderberry', '35-44', 'male', ['elderberry', 'apple', 'papaya']]]
df = pd.DataFrame(data, columns= ['ID','fav_fruit','age_group', 'gender', 'top3_fruits'])
ID fav_fruit age_group gender top3_fruits
0 1A apple 35-44 male [apple, strawberry, pineapple]
1 1B banana 15-24 female [apple, banana, durian]
2 1C cranberry 35-44 male [cranberry, apple, durian]
3 1D durian 15-24 female [durian, kiwi, banana]
4 1E elderberry 35-44 male [elderberry, apple, papaya]
现在,在这个数据框中,我想检查每一行并将其与所有其他行进行比较以确定某些条件。
- 我想检查age_group和gender是否相等
- 我想检查 fav_fruit 是否在 top3_fruits 中。
如果满足条件,那么我想将匹配行的“ID”和“top3_fruits”作为单独的列附加到数据帧 df 的末尾。
这是我编写的使用嵌套 for 循环执行此操作的代码。
df_copy = df.copy()
sample_df = pd.DataFrame()
matching_id = []
fruits_to_recommend = []
for i in range(len(df)):
for j in range(len(df)):
if (i!=j) and (df.iloc[i]['fav_fruit'] in df_copy.iloc[j]['top3_fruits']) and \
(df.iloc[i]['gender'] == df_copy.iloc[j]['gender']) and\
(df.iloc[i]['age_group'] == df_copy.iloc[j]['age_group']):
sample_df = sample_df.append(df_copy.iloc[[i]])
matching_id.append(df_copy.iloc[j]['ID'])
fruits_to_recommend.append(df_copy.iloc[j]['top3_fruits'])
sample_df['matching_id'] = matching_id
sample_df['fruits_to_recommend'] = fruits_to_recommend
我正在寻找更可行/更快的选择。
【问题讨论】:
-
为什么
1B和1D在输出中都有条目?如果这是预期的,那么1C和1E也应该在那里。 -
我提到的条件不满足 1C 和 1E,而满足 1B 和 1D。如果您在
df中看到ID和matching_id的对应行,则age_group和gender是相同的。而ID的fav_fruit在top3_fruits的matching_id中
标签: python pandas list dataframe nested-loops