无法在pandas中使用'if x in list

0 投票
1 回答
1529 浏览
提问于 2025-04-18 17:03

我正在使用 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),但这就看你自己了。)

撰写回答