如何解决更新:基于 Python 3.6+ 中的单个值跨多列过滤行的更 Pythonic 方法
我正在寻求有关如何简化代码的帮助。数据框 > 100k 行,并且可以有多个包含字符串和整数混合的列。这是一个示例 df:
data = {
"Area_1": [0,100,200,0],"Area_2": [0,100],"Area_3": [0,"id": ["gene_x","gene_y","gene_z","gene_i"],}
df = pd.DataFrame(data,columns=["id","Area_1","Area_2","Area_3"])
这是我认为可以简化大量有效但只能处理 3 列的代码的代码。如果所有列都包含整数 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,100],"Area_3": [0,"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)
输出:
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)
输出:
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,:]
输出:
Area_1 Area_2 Area_3
id
gene_y 100 0 0
gene_z 200 100 0
gene_i 0 100 100
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。