我有一个看起来像这样的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。
这是我的尝试。请注意,在执行此操作之前,列NaN
或A
中没有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
吗?
谢谢!
答案 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)