簡體   English   中英

刪除包含特定條件的行

[英]Dropping rows that contains a specific condition

我有一個數據集,我想刪除一些不可用的行。 我對要刪除行的特定條件使用了過濾器

filter = df.groupby(['Bairro'], group_keys=False, sort=True).size() > 1 print(filter.to_string())

拜羅
01 真的
02 錯誤的

所有條件為假的數據都是無用的。 我嘗試了一些東西,但都不起作用。

所以,我希望 dataframe 只保留條件為真的值:

拜羅
01 真的

df2 = ((df.groupby(['Bairro']).size()) != 1)

我什至打算按價值降低價值,但效果不佳

df2 = df[~df.isin(['02']).any(axis=1)]

嘗試將過濾器作為條件傳遞:

df.drop(df[df.groupby(['Bairro'], group_keys=False, sort=True).size() > 1], inplace = True)

在這種情況下, df.loc 方法似乎可以為您提供幫助。 在你的例子中:

new_df = df.loc[df['col2'] == "True"]

或者,如果您想使用多個條件:

new_df = df.loc[(df['col1'] == "True") & (df['col2'] == "True")]

我認為您對解決方案進行了過度設計,因此我選擇了對答案進行更詳細的解釋。

過濾 dataframe 的一種方法是簡單地為布爾值列表/數組添加下標。 如果數組的長度與 dataframe 的長度相同,這將 output 的視圖 dataframe 僅包含與 True 值對齊的行。

這是一個例子:

import pandas as pd
df = pd.DataFrame({
    'numbers': [0,1,2,3,4],
    'letters': ['a','b','c','d','e'],
    'colors': ['red', 'blue', 'yellow', 'green', 'purple']
})
df

哪些輸出:

數字 字母 colors
0 0 一種 紅色的
1個 1個 b 藍色的
2個 2個 c 黃色
3個 3個 d 綠色
4個 4個 電子 紫色的

這就是我訂閱 boolean 列表的意思(不確定這是否被接受的術語)

boolean_list = [True, True, False, True, False]
filtered_df = df[boolean_list]
filtered_df

哪些輸出:

數字 字母 colors
0 0 一種 紅色的
1個 1個 b 藍色的
3個 3個 d 綠色

我們可以使用簡單的 arguments 從 dataframe 生成這個 boolean 列表

df['numbers']>2

輸出:

0    False
1    False
2    False
3     True
4     True
Name: numbers, dtype: bool

我們可以使用這段看起來冗余的代碼來簡化過濾:

df[df['numbers']>2]

輸出:

數字 字母 colors
3個 3個 d 綠色
4個 4個 電子 紫色的

雖然它看起來多余,但我們所做的只是訂閱一個布爾值列表。 如所寫,這根本不會改變 df,因為我們需要做 df = df[filter_argument]

對於更復雜的過濾,我們可以使用 .apply() 來獲取我們的布爾值列表。 假設我們只想要“letters”中的字母以“colors”中的顏色出現的行:

def letter_in_color(row):
    return row['letters'] in row['colors']
boolean_arr = df.apply(letter_in_color, axis = 1)
print(boolean_arr)

0    False
1     True
2    False
3    False
4     True
dtype: bool

letter_in_color_df = df[boolean_array]
letter_in_color_df
數字 字母 colors
1個 1個 b 藍色的
4個 4個 電子 紫色的

我做了這么長的解釋,因為雖然使用 boolean 數組過濾 df 的概念非常簡單,但查看這樣做的代碼通常看起來很奇怪或多余,並且不清楚到底發生了什么。

我希望你沒有停止閱讀:

因為有一個重要而強大的工具可以添加到上述情況以排除許多錯誤和意外行為:“.loc[]”這是一個更明確和強大的索引器,在上述所有情況下我們都可以獲得它幾乎沒有變化的好處:

df[boolean_array] 變成 df.loc[boolean_array]

有關 df.loc[] 而不是 df[] 的更多信息,請參閱此答案

暫無
暫無

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

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