在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'])]]