簡體   English   中英

根據列子集過濾數據框

[英]Filter a dataframe based on subset of columns

以下是數據框

import pandas as pd
df = pd.DataFrame({'A' : [1, 1, 2, 2, 3, 4, 5],
                   'B' : [11, 11, 12, 12, 13,14,15],
                   'C' :[0.12232, 0.12232, 0.3455, 0.3455, 0.112, 0.567, 0.8901],
                   'D' :[False, True, True, True, True, True, True],
                   'E' :[True, True, False, True, True, True, True],
                   'F' :[False, True, False, True, True, True, True]})

   A   B        C      D      E      F
0  1  11  0.12232  False   True  False
1  1  11  0.12232   True   True   True
2  2  12  0.34550   True  False  False
3  2  12  0.34550   True   True   True
4  3  13  0.11200   True   True   True
5  4  14  0.56700   True   True   True
6  5  15  0.89010   True   True   True

將 drop_duplicates 與數據框的子集列列表一起使用對我不起作用。 請讓我知道,如何以簡單快捷的方式做到這一點

如果 A、B、C 列的值重復。 請檢查 D、E、F 是否為真,從數據框中刪除該行。

預期輸出數據幀:

   A   B        C      D      E      F
0  1  11  0.12232  False   True  False
2  2  12  0.34550   True  False  False
4  3  13  0.11200   True   True   True
5  4  14  0.56700   True   True   True
6  5  15  0.89010   True   True   True

我們可以使用DataFrame.duplicated來檢查A,B and C + DataFrame.all來檢查D,E and F Series.mul在這里用於在兩個布爾系列之間進行AND運算,以使代碼更清晰:

m =(  df.duplicated(subset = ['A','B','C'],keep = False)
        .mul(df[['D','E','F']].all(axis=1)) )
df.loc[~m]

輸出

   A   B        C      D      E      F
0  1  11  0.12232  False   True  False
2  2  12  0.34550   True  False  False
4  3  13  0.11200   True   True   True
5  4  14  0.56700   True   True   True
6  5  15  0.89010   True   True   True

這是我的方法:

t = (df['D'] == True) & (df['E'] == True) & (df['F'] == True) # check where D, E, F are True
e = df.duplicated(subset=['A','B', 'C']) # Check duplicates in A, B, C
a = (e == True) & (e == True) # Check where duplicates are true in D, E, F
a = a.index[a].tolist() # get the index
df = df.drop(index=a) # drop duplicates True in D, E, F
print(df)

#    A   B        C      D      E      F
# 0  1  11  0.12232  False   True  False
# 2  2  12  0.34550   True  False  False
# 4  3  13  0.11200   True   True   True
# 5  4  14  0.56700   True   True   True
# 6  5  15  0.89010   True   True   True

考慮使用輔助列通過以下方式進行邏輯子集:

df = df.assign(grp_count = lamba x: x.groupby(['A','B','C']).transform('count'),
               sum_bool = lamba x: x.reindex['D','E','F'].sum(axis=1))

sub_df = (df[(df['grp_count'] > 1 & df['sum_bool'] != 3) | (df['grp_count'] == 1)]
           .drop(columns=['grp_count', 'sum_bool']))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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