[英]How to filter out multiple rows in a pandas.DataFrame based on multiple conditions for the same column
我有一個示例 pd.DataFrame 包含在不同開發工作室開發的軟件的代號:
df = pd.DataFrame({'project_id': [36423, 28564, 96648, 96648, 10042, 68277, 68277, 68277], 'codename': ['banana', 'apple', 'peach', 'peach', 'melon', 'pear', 'pear', 'pear'], 'studio': ['paris', 'amsterdam', 'frankfurt', 'paris', 'london', 'brussel', 'amsterdam', 'sofia']})
id codename studio
0 36423 banana paris
1 28564 apple amsterdam
2 96648 peach frankfurt
3 96648 peach paris
4 10042 melon london
5 68277 pear brussel
6 68277 pear amsterdam
7 68277 pear sofia
過濾掉這些包含已開發項目的行的最佳方法是什么
我試圖達到的結果如下所示:
至少有兩個不同的工作室正在開發哪些項目:
project_id codename studio
0 96648 peach frankfurt
1 96648 peach paris
2 68277 pear brussel
3 68277 pear amsterdam
4 68277 pear sofia
法蘭克福和巴黎正在開發哪些項目?
project_id codename studio
0 96648 peach frankfurt
1 96648 peach paris
例如,使用df.loc[df['studio'].isin(['frankfurt', 'paris'])]
不起作用,因為此函數會過濾掉列studio
中包含frankfurt
或paris
的所有行。 有沒有比過濾frankfurt
和paris
的數據框並使用Series.intersection()
方法更優雅的方法? 我的想法在這里用完了。
提前致謝! :)
對於第一個問題:
df[df.groupby('project_id')['studio'].transform('nunique').ge(2)]
輸出:
project_id codename studio
2 96648 peach frankfurt
3 96648 peach paris
5 68277 pear brussel
6 68277 pear amsterdam
7 68277 pear sofia
對於第二個:
df[df.groupby('project_id')['studio']
.transform(lambda x: set(x)=={'frankfurt', 'paris'})]
# if you want at least frankfurt+paris, use
# set(x)>={'frankfurt', 'paris'})
輸出:
project_id codename studio
2 96648 peach frankfurt
3 96648 peach paris
我喜歡用索引來解決這個問題:
第一個:
idxs_min_2_studios = df.apply(lambda x: (df.project_id == x.project_id).sum() , axis=1) >= 2
print(df[idxs_min_2_studios])
project_id codename studio
2 96648 peach frankfurt
3 96648 peach paris
5 68277 pear brussel
6 68277 pear amsterdam
7 68277 pear sofia
第二個:
reqd_studios = {'amsterdam', 'sofia'}
idx_reqd_studios = df.apply(lambda x: reqd_studios.issubset(set(df[df.project_id == x.project_id].studio)) ,axis=1)
print(df[idx_reqd_studios])
project_id codename studio
5 68277 pear brussel
6 68277 pear amsterdam
7 68277 pear sofia
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.