无法在pandas中使用'if x in list
我正在使用 df.iterrows
来遍历一个有四列的数据表,数据表大概长这样:
A B C D
----------------------
A ABC
B ABD
C ABE
D ABC
E BC
F D
不过,我只想处理当A列的字母在一个特定的列表里时,才进行操作,这个列表长这样:
slist = ['A', 'C', 'E']
我的目标是,如果任何一行的B列有A,就在C列标记一个X;如果B列有C,就在D列标记一个X。如果两者都有,就两个都标记。
最后,结果应该是这样的:
A C D
---------------
A X X
C X -
E - X
所以,我现在的代码是这样的:
for index, x in df.iterrows():
if x['A'] in slist:
if 'A' in x['B'] and 'P' in x['B']:
x['C'] = 'X'
x['D'] = 'X'
elif 'C' in x['B'] and 'A' not in x['B']:
x['D'] = 'X'
elif 'A' in x['B'] and 'C' not in x['B']:
x['C'] = 'x'
else:
continue
但是 if x['A'] in slist:
这个条件总是没法成立,我得到的C列和D列都是空的。
我漏掉了什么导致这种情况发生?我在其他项目中也遇到过同样的问题,但我找到了解决办法。这次必须使用列表,但我就是搞不定。
1 个回答
3
我会使用向量化的字符串操作来处理这个问题,特别是用到 str.contains
(具体的用法可以在 这里查看文档):
>>> df = pd.DataFrame({"A": list("ABCDEF"), "B": "ABC ABD ABE ABC BC D".split()})
>>> df["C"] = df["B"].str.contains("A")
>>> df["D"] = df["B"].str.contains("C")
>>> df
A B C D
0 A ABC True True
1 B ABD True False
2 C ABE True False
3 D ABC True True
4 E BC False True
5 F D False False
然后如果你真的想的话,可以加上 Xs:
>>> df.replace({True: "X", False: ""})
A B C D
0 A ABC X X
1 B ABD X
2 C ABE X
3 D ABC X X
4 E BC X
5 F D
如果你只想在 A 是 {"A", "C", "E"}
的情况下进行这个操作,你可以用 isin
来选择这些行:
>>> slist = ["A", "C", "E"]
>>> df[df["A"].isin(slist)]
A B
0 A ABC
2 C ABE
4 E BC
然后再应用上面的方法。(我有时候会加上 reset_index(drop=True)
,但这就看你自己了。)