我有一个包含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')]
这段代码是无效的语法。这与我之前问过的问题类似,因此感到困惑,为什么上面的代码不起作用。
任何帮助都会很棒
答案 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)
您可以将groupby
与filter
一起使用:
df.groupby('name').filter(lambda x: all(x.age > 10)).reset_index()
输出:
i age name
0 1 22 Harry
1 4 20 William