如果列表中的x不能使用'用熊猫

时间:2014-08-12 19:05:51

标签: python pandas

我正在使用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标记C列,如果它有C,它会用D标记D列。如果它有两个,它将两者都标记。

最后,它看起来像这样:

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 个答案:

答案 0 :(得分:3)

我会使用矢量化字符串操作,尤其是str.contains(参见文档here):

>>> 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

然后如果你真的想要施加X:

>>> 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)中投掷,但这取决于你。)