[英]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)]
目前,此代碼執行沒有錯誤,但返回 df 而沒有按預期過濾。 我的期望是刪除任何不包含值 >0 的行
先感謝您!
可以嘗試以下方法。
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
# 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
# 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.