熊猫:检查另一列的成员资格时创建NaN?

时间:2018-07-27 20:34:06

标签: python pandas

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

           A    B
0   [C, D, E]   C
1   [H, I, J]   Z

可以使用以下方法重新创建它:

temp = pd.DataFrame({"A":[["C", "D", "E"], ["H", "I", "J"]], "B":["C", "Z"]})

如果该行的C值包含在该行的B值中,我想在新列A中记录1。例如,“ C”包含在行0的A列中,因此得到1。另一方面,“ Z”不包含在行1的A列中,因此得到0。

这是我的尝试。请注意,在执行此操作之前,列NaNA中没有B

df["C"] = pd.Series([b in a for a, b in zip(df.A, df.B)]).astype(int)

但是,这会将大约2,000 NaN放入列C中。我摘下.astype(int)部分,并拥有相同数量的NaN,所以认为那部分很好。

您知道什么可能会创建这些NaN吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您的数据框没有自然索引(数字从0到frame-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

有很多方法可以使对齐方式起作用,无论是通过显式创建具有正确索引的东西,完全没有索引还是通过熊猫在其中建立一个索引。

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

答案 1 :(得分:0)

使用apply应该可以解决问题:

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