繁体   English   中英

如果列值的组合等于列表中的元组,则删除Pandas中的dataFrame行

[英]Deleting dataFrame row in Pandas if a combination of column values equals a tuple in a list

我目前这样做是为了删除列表removal_list中具有特定列'some_column'值的removal_list

df = df[~df['some_column'].isin(removal_list)]

如果我想比较元组列表中的值组合,我该怎么做? (如果有更好的方法可以实现这一点,则不一定需要是元组列表)

例如:

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

如果df['column_1']df['column_2']的特定行的具有值item1store1 (或任何其他元组removal_list ),然后删除该行

另外,可能需要评估两列以上的列

编辑更好的例子:

client  account_type    description
0   1   2   photographer
1   2   2   banker
2   3   3   banker
3   4   2   journalist
4   5   4   journalist

remove_list = [(2,journalist),(3,banker)]

检查列account_typedescription

输出:

client  account_type    description
0   1   2   photographer
1   2   2   banker
4   5   4   journalist

说你有

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

然后

df[['column_1', 'column_2']].apply(tuple, axis=1)

应该创建一系列元组,等等

df[['column_1', 'column_2']].apply(tuple, axis=1).isin(removal_list)

是你所追求的二元条件。 删除与以前一样。 这适用于任意数量的列。

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df[['a', 'b']].apply(tuple, axis=1).isin([(1, 3), (30, 40)])
0    (1, 3)
1    (2, 4)
dtype: object

我建议创建DataFrame并与默认的内部DataFrame merge

remove_list = [(2,'journalist'),(3,'banker')]

df1 = pd.DataFrame(remove_list, columns=['account_type','description'])
print (df1)
   account_type description
0             2  journalist
1             3      banker

df = df.merge(df1, how='outer', indicator=True).query('_merge != "both"').drop('_merge', 1)
print (df)
   client  account_type   description
0       1             2  photographer
1       2             2        banker
4       5             4    journalist

一种方法是从压缩2列创建一个系列,然后使用布尔索引。 我还建议您使用set而不是list进行O(1)查找。

remove_set = {(2,'journalist'),(3,'banker')}

condition = pd.Series(list(zip(df.account_type, df.description))).isin(remove_set)

res = df[~condition]

print(res)

   client  account_type   description
0       1             2  photographer
1       2             2        banker
4       5             4    journalist

如果索引设置为['account_type', 'description'] ,我们可以使用drop方法。

df.set_index(['account_type', 'description']).drop(remove_list).reset_index()

   account_type   description  client
0             2  photographer       1
1             2        banker       2
2             4    journalist       5

您可以使用带有额外列的查询方法来进行选择。

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

df['removal_column'] = df.apply(lambda x: (x.account_type, x.description), axis='columns')
df = df.query('removal_column not in @removal_list').drop('removal_column', axis='columns')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM