我的数据帧包括列表,如下所示。
a b
1 frog [1, 2, 3]
2 dog [4, 5]
3 melon [6, 7, 1]
我想提取b包含特定数字的行,所以我做了这个函数。
def a(_list, _tag):
if _tag in _list:
return True
else:
return False
我尝试使用df.loc[],但效果不好。如何在不迭代所有数据帧的情况下编写代码?
我的预期输出是这样的。如果我想在b中找到包含"1"的行,输出将是
a b
1 frog [1, 2, 3]
3 melon [6, 7, 1]
这里有一种方法可以满足您的问题:
target = 1
df2 = df.explode('b').b == target
df['found'] = df2.groupby(df2.index).sum() > 0
print(df)
输出:
a b found
0 frog [1, 2, 3] True
1 dog [4, 5] False
2 melon [6, 7, 1] True
您的a
函数可以简化为
def a(_list, _tag):
return _tag in _list
您可以在Series.apply
中使用它
out = df['b'].apply(lambda _list: a(_list, _tag))
# or
out = df['b'].apply(lambda _list: _tag in _list)
您可以尝试这个简单的pandas
oneliner:
df[df.explode('B').eq(1).groupby(df.explode('B').A, sort=False).sum().B.apply(bool).values]
输出:
A B
0 frog [1, 2, 3]
2 melon [6, 7, 1]
使用.explode
和.loc
来获得相关的唯一索引,然后使用.iloc
:进行查询
df.iloc[df.explode("b").loc[df["b"].isin(target_hash_set)].index.unique()]