Python 熊猫:在检查一个列在另一个列中的成员身份时创建NAN?

Python 熊猫:在检查一个列在另一个列中的成员身份时创建NAN?,python,pandas,Python,Pandas,我有一个看起来像这样的数据框(实际上有数千行): 可以通过以下方式重新创建它: temp = pd.DataFrame({"A":[["C", "D", "E"], ["H", "I", "J"]], "B":["C", "Z"]}) 如果该行的B值包含在该行的a列中,我想在新列C中记录1。例如,“C”包含在第0行的A列中,因此它得到1。另一方面,“Z”不包含在第1行的A列中,因此它得到一个0 这是我的尝试。请注意,执行此操作之前,A或B列中都没有NaNs df["C"] = pd.Serie

我有一个看起来像这样的数据框(实际上有数千行):

可以通过以下方式重新创建它:

temp = pd.DataFrame({"A":[["C", "D", "E"], ["H", "I", "J"]], "B":["C", "Z"]})
如果该行的
B
值包含在该行的
a
列中,我想在新列
C
中记录1。例如,“C”包含在第0行的
A
列中,因此它得到1。另一方面,“Z”不包含在第1行的
A
列中,因此它得到一个0

这是我的尝试。请注意,执行此操作之前,
A
B
列中都没有
NaN
s

df["C"] = pd.Series([b in a for a, b in zip(df.A, df.B)]).astype(int)
但是,这会将大约2000个
NaN
s放入
C
列中。我去掉了
.astype(int)
部分,并且有相同数量的
NaN
s,所以我认为这部分很好

知道是什么造成了这些
NaN
s吗

谢谢

使用应该可以做到:

temp['C'] = temp.apply(lambda x: x['B'] in x['A'], axis=1).astype(int)

如果您的数据帧没有自然索引(数字从0上升到帧的长度-1),就会发生这种情况,因为赋值将尝试在共享索引上对齐。例如:

In [111]: df
Out[111]: 
           A  B
0  [C, D, E]  C
1  [H, I, J]  Z

In [112]: df.index = [0, 2]

In [113]: df
Out[113]: 
           A  B
0  [C, D, E]  C
2  [H, I, J]  Z

In [114]: df["C"] = pd.Series([10, 20])  # has index [0, 1]

In [115]: df
Out[115]: 
           A  B     C
0  [C, D, E]  C  10.0
2  [H, I, J]  Z   NaN
然而,如果我们使用匹配索引,它将起作用:

In [116]: df["C"] = pd.Series([10, 20], index=[0, 2])

In [117]: df
Out[117]: 
           A  B   C
0  [C, D, E]  C  10
2  [H, I, J]  Z  20
有很多方法可以让对齐工作,无论是通过显式创建具有正确索引的内容,还是完全没有索引,或者让pandas在途中构建索引:

In [118]: df["D"] = pd.Series([11, 22], index=df.index)

In [119]: df["E"] = [11, 22]

In [120]: df["F"] = df.apply(lambda x: x["D"] * 5, axis=1)

In [121]: df
Out[121]: 
           A  B   C   D   E    F
0  [C, D, E]  C  10  11  11   55
2  [H, I, J]  Z  20  22  22  110

你能给出一个生成NAN的测试用例吗?
In [118]: df["D"] = pd.Series([11, 22], index=df.index)

In [119]: df["E"] = [11, 22]

In [120]: df["F"] = df.apply(lambda x: x["D"] * 5, axis=1)

In [121]: df
Out[121]: 
           A  B   C   D   E    F
0  [C, D, E]  C  10  11  11   55
2  [H, I, J]  Z  20  22  22  110