使用 lambda 删除几行 pandas 数据帧

Posted

技术标签:

【中文标题】使用 lambda 删除几行 pandas 数据帧【英文标题】:Drop few rows of a pandas dataframe using lambda 【发布时间】:2018-05-07 16:22:28 【问题描述】:

我目前在处理 Pandas 中的数据帧时遇到了方法链接问题,这是我的数据结构:

import pandas as pd

lst1 = range(100)
lst2 = range(100)
lst3 = range(100)
df = pd.DataFrame(
    'Frenquency': lst1,
     'lst2Tite': lst2,
     'lst3Tite': lst3
    )

问题是如果频率小于6,则获取条目(行),但需要在方法链接中完成。

我知道使用传统方式很容易,我可以这样做

df[df["Frenquency"]<6]

得到答案。

但是,问题是关于如何使用方法链接来做到这一点,我尝试了类似

df.drop(lambda x:x.index if x["Frequency"] <6 else null)

但它引发了错误"[<function <lambda> at 0x7faf529d3510>] not contained in axis"

谁能分享一下这个问题?

【问题讨论】:

Frequency 中有一个错字(你写过一次Frenquency),它在 python 中是 None 而不是 null 方法链是什么意思?如果你有多个条件,你可以&他们一起,例如df[(df.Frequency < 6) & (df.lst2Tite > 3)]。你的情况还不够吗? @scnerd 通过方法链接,我的意思是像 `df = (df.rename(something") .drop("something") .assign("something") ) `按函数的数据帧并在每个步骤中返回一个数据帧,我认为方法链接的另一个词是“Pythonic”? 感谢纠正我,@mrCarnivore 我放在这里的代码只是演示这个想法,但如果我输入正确会更有意义:) 该术语是“流畅的界面”。 Pandas 确实 支持这一点,不过,我不确定它是否一定是 pythonic —— 我想这取决于你的口味。请注意,大多数内置 python 对象不支持流畅的界面。 【参考方案1】:

这是一个老问题,但我会回答,因为没有可接受的答案供将来参考。

df[df.apply(lambda x: True if (x.Frenquency) <6 else False,axis=1)]

解释:此 lambda 函数检查频率,如果是,则分配 True,否则分配 False,以及 df 使用的一系列 True 和 False 仅索引真实值。请注意,列名 Frenquency 是一个错字,但我保持原样,因为问题是这样的。

【讨论】:

【参考方案2】:

或者这样:

df.drop(i for i in df.Frequency if i >= 6)

或者就地使用:

df.drop((i for i in df.Frequency if i >= 6), inplace=True)

【讨论】:

【参考方案3】:

对于这种选择,您可以通过使用query 方法来维护流畅的界面并使用方法链接:

>>> df.query('Frenquency < 6')
   Frenquency  lst2Tite  lst3Tite
0           0         0         0
1           1         1         1
2           2         2         2
3           3         3         3
4           4         4         4
5           5         5         5
>>>

比如:

df.rename(<something>).query('Frenquency <6').assign(<something>)

或者更具体地说:

>>> (df.rename(columns='Frenquency':'F')
...    .query('F < 6')
...    .assign(FF=lambda x: x.F**2))
   F  lst2Tite  lst3Tite  FF
0  0         0         0   0
1  1         1         1   1
2  2         2         2   4
3  3         3         3   9
4  4         4         4  16
5  5         5         5  25

【讨论】:

【参考方案4】:

觉得这篇文章没有解决问题精神的答案。对链最友好的方式是(可能)使用 Panda 的.loc

import pandas as pd

lst1 = range(100)
lst2 = range(100)
lst3 = range(100)
df = pd.DataFrame("Frequency": lst1, "lst2Tite": lst2, "lst3Tite": lst3)

df.loc[lambda _df: 6 < _df["Frequency"]]

简单!

【讨论】:

【参考方案5】:

这能满足您的需求吗?

df.mask(df.Frequency >= 6).dropna()

【讨论】:

以上是关于使用 lambda 删除几行 pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:将 Lambda 应用于多个数据帧

蟒蛇。在Pandas数据帧中使用Lambda函数的IF条件

广播数据帧没有删除洗牌阶段(几行数据)[重复]

将 pandas 数据帧转换为 json 很慢

Pandas 数据框 - lambda 演算和每个系列的最小值

删除重复的pandas数据帧