我正在使用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列完全空白。
我错过了什么导致这种情况发生?我在其他项目上遇到了同样的问题,但是已经解决了这个问题。这一次,有必要使用一个列表,我似乎无法让它工作。
答案 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)
中投掷,但这取决于你。)