gpt4 book ai didi

python - 如何根据多列数据从 Pandas 数据框中删除行?

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:04 25 4
gpt4 key购买 nike

我知道如何根据 this stack overflow question, 中的简单条件删除行但是,我需要使用更复杂的条件来删除行。

我的情况:我有几行数据,每行有四列包含数字代码。我需要删除所有没有至少一个前导数字小于 5 的代码的行。我目前有一个可以与 dataframe.apply 一起使用的函数,它创建一个新列,'keep',和如果要保留一行,则用 1 填充它。然后,我使用那个简单的保留列进行第二次传递,以删除不需要的行。我正在寻找一种无需创建新列即可一次性完成此操作的方法。

示例数据:

   a | b | c | d
0 145|567|999|876
1 999|876|543|543

在该数据中,我想保留第一行,因为在“a”列中,前导数字小于 5。第二行没有前导数字小于 5 的列,因此需要删除该行.

最佳答案

这应该有效:

In [31]:
df[(df.apply(lambda x: x.str[0].astype(int))).lt(5).any(axis=1)]

Out[31]:
a b c d
0 145 567 999 876

所以基本上这会使用向量化的 str 获取每列的第一个字符方法,我们将其转换为一个 int,然后我们调用 lt这少于按行生成 bool df,然后我们在 df row-wise 上调用 any 以在用于屏蔽 df 的索引上生成 bool 掩码。所以打破上面的内容:

In [34]:
df.apply(lambda x: x.str[0].astype(int))

Out[34]:
a b c d
0 1 5 9 8
1 9 8 5 5

In [35]:
df.apply(lambda x: x.str[0].astype(int)).lt(5)

Out[35]:
a b c d
0 True False False False
1 False False False False

In [37]:
df.apply(lambda x: x.str[0].astype(int)).lt(5).any(axis=1)

Out[37]:
0 True
1 False
dtype: bool

编辑

要处理 NaN 值,您可以调用 dropna :

In [39]:
t="""a,b,c,d
0,145,567,999,876
1,999,876,543,543
2,,324,344"""
df = pd.read_csv(io.StringIO(t),dtype=str)
df

Out[39]:
a b c d
0 145 567 999 876
1 999 876 543 543
2 NaN 324 344 NaN

In [44]:
df[(df.apply(lambda x: x.dropna().str[0].astype(int))).lt(5,axis=0).any(axis=1)]

Out[44]:
a b c d
0 145 567 999 876
2 NaN 324 344 NaN

关于python - 如何根据多列数据从 Pandas 数据框中删除行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30381427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com