熊猫-如何检查列中的项目是否低于某个特定值,如果是,则删除此项目和任何关联的行

时间:2018-07-24 16:23:07

标签: python pandas

我有一个包含2列的数据框:“年龄”和“名称”。看起来像这样(在记事本中打开时):

,age,name
0,18,Bill
1,22,Harry
2,9,Bill
4,20,William

(第一列是索引)

我要删除年龄列中的年龄低于某个特定值的所有行,例如10.为此,我可以做到这一点(有效):

df = df[df['age'] > 1

但是,我也想在名称列中删除具有相同名称的行。例如,在我的数据框的上述片段中,我希望输出看起来像这样:

,age,name
1,22,Harry
4,20,William

到目前为止,我有这个:

df = (df[df['age'] > 10).groupby(df['name']).transform('any')]

这段代码是无效的语法。这与我之前问过的问题类似,因此感到困惑,为什么上面的代码不起作用。

任何帮助都会很棒

3 个答案:

答案 0 :(得分:3)

我认为您正在寻找all

df[df.age.gt(10).groupby(df.name).transform('all')]
Out[338]: 
   Unnamed: 0  age     name
1           1   22    Harry
3           4   20  William

答案 1 :(得分:3)

您还可以先在名称列中删除重复项,然后为年龄大于10的年龄建立索引:

df.drop_duplicates('name',keep=False)[df.age > 10]

   age     name
1   22    Harry
4   20  William

编辑基于问题标题和评论,也许我误解了该问题,实际上您只是在尝试删除数据框中所有至少具有一个小于10的值的名称。情况下,您可以执行以下操作:

df[~df.name.isin(df.loc[df.age < 10, 'name'])]

   age     name
1   22    Harry
4   20  William

答案 2 :(得分:2)

您可以将groupbyfilter一起使用:

df.groupby('name').filter(lambda x: all(x.age > 10)).reset_index()

输出:

   i  age     name
0  1   22    Harry
1  4   20  William