Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python的“其他列”列表中选择具有列值的行_Python_Pandas - Fatal编程技术网

在Python的“其他列”列表中选择具有列值的行

在Python的“其他列”列表中选择具有列值的行,python,pandas,Python,Pandas,我有一个熊猫数据框,格式如下: col1 col2 ... col4 A 2 [2-3-4] B 3 [2-6] A 3 [2-3-4] C 2 [2-3-4] D 2 [2-3-4] 我只想选择col2中的值在col4列表中的行 我尝试使用: df[(df["col2"].isin(df["col4"

我有一个熊猫数据框,格式如下:

col1  col2  ...      col4
   A     2        [2-3-4]
   B     3        [2-6]
   A     3        [2-3-4]
   C     2        [2-3-4]
   D     2        [2-3-4]
我只想选择col2中的值在col4列表中的行

我尝试使用:

df[(df["col2"].isin(df["col4"].str.split("-"))]
但是我得到一个空的数据帧…

您可以尝试以下方法:

import ast
df.col4 = df.col4.str.replace('-',',').apply(ast.literal_eval)
new_df = df[df.apply(lambda x: x['col2'] in x['col4'], axis =1)]
代码

df['col4'] = df.col4.astype(str).str.replace('-',',')
df['col2'] = df.col2.astype(str)
df= df[df.apply(lambda x: x.col2 in x.col4, axis=1)]
输出

    col1    col2    col4
0   A       2   [2,3,4]
2   A       3   [2,3,4]
3   C       2   [2,3,4]
4   D       2   [2,3,4]

对于这个用例,我会在这里使用一个列表:

df[[str(a) in b for a,b in zip(df['col2'],df['col4'])]]


或者使用不匹配2和22的正则表达式搜索#谢谢@Nk03

import re
df[[bool(re.search(fr'\b{a}\b',b)) for a,b in zip(df['col2'],df['col4'])]]

谢谢,但是最后的数据框仍然是空的…我可以在这里看到一个问题。假设df['col2']包含2,df['col4']包含[22-3-1]。然后它也会标记为真的。我有什么遗漏吗@anky@Nk03谢谢,很好的观点,用单词边界更新了我的答案,以匹配完整的字符串。这将在不将字符串转换为元素列表的情况下工作。无需转换您正在使用中的
谢谢,修改了代码。
import re
df[[bool(re.search(fr'\b{a}\b',b)) for a,b in zip(df['col2'],df['col4'])]]