簡體   English   中英

更新:基於 Python 3.6+ 中的單個值跨多列過濾行的更 Pythonic 方式

[英]Updated: A more pythonic way to filter rows across multiple columns based on single value in Python 3.6+

我正在尋求有關如何簡化代碼的幫助。 dataframe 超過 100k 行,並且可以有多個包含字符串和整數混合的列。 這是一個例子df:

data = {
    "Area_1": [0, 100, 200, 0],
    "Area_2": [0, 0, 100, 100],
    "Area_3": [0, 0, 0, 100],
    "id": ["gene_x", "gene_y", "gene_z", "gene_i"],
}
df = pd.DataFrame(data, columns=["id", "Area_1", "Area_2", "Area_3"])

這是我認為可以簡化大量有效但只能處理 3 列的代碼的代碼。 如果所有列都包含 integer 0,我現在想接受任意數量的列並過濾行。

Expected output :
everything in the dataframe but the row containing gene_x.

當前代碼:

cut=r'^Area'
blade = df.columns.str.contains(cut)
df[(df.loc[:,blade] > 0).any(axis=1)]

Dataframe 示例: 數據框

目前,此代碼執行沒有錯誤,但返回 df 而沒有按預期過濾。 我的期望是刪除任何不包含值 >0 的行

先感謝您!

可以嘗試以下方法。

創建 dataframe

import pandas as pd

data = {
    "Area_1": [0, 100, 200, 0],
    "Area_2": [0, 0, 100, 100],
    "Area_3": [0, 0, 0, 100],
    "id": ["gene_x", "gene_y", "gene_z", "gene_i"],
}
df = pd.DataFrame(data, columns=["id", "Area_1", "Area_2", "Area_3"])
df = df.set_index("id")
print(df)

Output:

        Area_1  Area_2  Area_3
id                            
gene_x       0       0       0
gene_y     100       0       0
gene_z     200     100       0
gene_i       0     100     100

創建一個 boolean 掩碼,指示我們想要的行

# Subset the columns we are interested in.
df_tmp = df.filter(regex="^Area_", axis="columns")
mask = df_tmp == 0
print(mask.head())

# Collapse across columns
all_cols_zero = mask.all(axis=1)
print(all_cols_zero)

Output:

        Area_1  Area_2  Area_3
id                            
gene_x    True    True    True
gene_y   False    True    True
gene_z   False   False    True
gene_i    True   False   False

id
gene_x     True
gene_y    False
gene_z    False
gene_i    False
dtype: bool

將 boolean 面膜應用到我們的原裝 dataframe

# Keep rows where at least one column is non-zero.
# The ~ gets the inverse. So True becomes False.
df.loc[~all_cols_zero, :]

Output:

        Area_1  Area_2  Area_3
id                            
gene_y     100       0       0
gene_z     200     100       0
gene_i       0     100     100

暫無
暫無

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

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