簡體   English   中英

如何根據同一列的多個條件過濾掉 pandas.DataFrame 中的多行

[英]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

過濾掉這些包含已開發項目的行的最佳方法是什么

  1. 在至少兩個不同的工作室?
  2. 在兩個特定的工作室?

我試圖達到的結果如下所示:

至少有兩個不同的工作室正在開發哪些項目:

   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中包含frankfurtparis的所有行。 有沒有比過濾frankfurtparis的數據框並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM