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