当前位置: 首页 > 知识库问答 >
问题:

如何在一个条件包括两列的情况下预成型loc

申屠喜
2023-03-14

大家好,我需要你们的帮助。

我有两个列A和B的df,它们都是字符串值的列

例子:

df_1 = pd.DataFrame(data={
    "A":['a','b','c'],
    "B":['a x d','z y w','q m c'] #string values not a list
})
print(df_1)

#output
   A      B
0  a  a x d
1  b  z y w
2  c  q m c

现在我要做的是在df_1中预先设置loc,以获得所有列B包含列A中字符串值的行。

在这个例子中,我想要的输出是第一行和第三行

   A      B
0  a  a x d # 'a x d' contain value 'a'
2  c  q m c # 'q m c' contain value 'c'

我尝试了不同的loc条件,但得到了无法破解的类型:'系列'错误:

df_1.loc[df_1["B"].str.contains(df_1["A"])] #TypeError: unhashable type: 'Series'
df_1.loc[df_1["A"] in df_1["B"]] #TypeError: unhashable type: 'Series'

由于df的大小,我真的不想使用for/time循环

知道我该怎么做吗?谢谢

共有3个答案

劳华灿
2023-03-14

你可以试试:

out = df_1.loc[df_1.apply(lambda x: x['A'] in x['B'], axis=1)]
print(out)

# Output
   A      B
0  a  a x d
2  c  q m c

使用numpy替代:

df_1.loc[np.apply_along_axis(lambda x: x[0] in x[1], axis=1, arr=df_1)]
幸弘光
2023-03-14

可爱的

from operator import contains

df_1.loc[map(contains, *map(df_1.get, ['B', 'A']))]

   A      B
0  a  a x d
2  c  q m c

没有进口但有一个丑陋的dunder…/-:

df_1.loc[map(str.__contains__, *map(df_1.get, ['B', 'A']))]

还有,对OP。。。不要接受这个答案。我只是在打高尔夫球。您永远不应该在生产代码中使用它,因为由于使用了两个映射和一个splat,它的透明度较低。

只是为了超级清楚...

莫兹韦的更好

卞琨
2023-03-14

没有矢量方法,可以使用两列在中映射。你需要在这里循环:

mask = [a in b for a,b in zip(df_1['A'], df_1['B'])]

df_1.loc[mask]

输出:

   A      B
0  a  a x d
2  c  q m c
# operator.contains
518 µs ± 4.61 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# list comprehension
554 µs ± 3.84 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# numpy.apply_along_axis
7.32 ms ± 58.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# apply
20.7 ms ± 379 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

 类似资料:
  • 你好,我有个问题。以下是代码示例: 我有一个多选表格: 这是我的开关盒: 代码的工作原理是,如果用户选择例如GB11,结果将是: 工厂GB11 ZMD_LPLCNMAT_GB11 ZMD_LPQAMAT_GB11 ZMD_LSOCNMAT_GB11 ZMD_PLNTMAT_GB11 ZMD_SLSVMAT_GB11 当我选择GB10和GB20时,我不想选择得到结果,例如“测试”,而不是它们的组合。

  • rbindlist做的正是我需要的,但'do.call'做不到! do.Call不是我想要的

  • 问题内容: 在Python中,我可以找到连接两个列表的唯一方法是,它会修改第一个列表。是否有任何串联函数返回其结果而不修改其参数? 问题答案: 是:。这给出了一个新的列表是的串联和。

  • 我需要为密码字段设置一个错误,条件是“只允许2到22个字符和符号,\-” 但是我有点困在这里了。 这是我到目前为止得到的: 但问题是,如果我输入了_或-以外的符号,错误消息仍然不会显示。对于输入长度,错误消息显示为它应该显示的样子。

  • 我试图让发送消息给另一方的用户和接收消息的用户在每行的一行中。 那么oracle sql查询应该是什么呢

  • 问题内容: 我怎么能包括为没有MANIFEST.in文件? 我的setup.py看起来像这样: 版本: 我就是无法加入。 还是此博客文章仍然正确? http://blog.codekills.net/2011/07/15/lies,-more-lies-and-python-packaging- documentation-on– package_data-/ 不过,在过去的一个小时中,我了解到这