我在数据框中有两列。第一个在每一行中包含一个字符串。第二个包含每一行的一组字符串。我如何使用熊猫函数检查每一行的第一列中的值是否在第二列中,以及它的效率?
pd.DataFrame([np.random.randint(5,size = 12),np.random.randint(5,size =(12,5))])。T
如何检查第1列列表中第0列的值
答案 0 :(得分:8)
具有列表理解和zip
(IMO,这比apply
快):
df=df.assign(Check=[a in b for a,b in zip(df[0],df[1])])
0 1 Check
0 4 [4, 4, 2, 3, 0] True
1 4 [1, 0, 2, 1, 4] True
2 0 [2, 1, 1, 2, 2] False
3 0 [0, 3, 3, 2, 3] True
4 4 [3, 0, 0, 3, 1] False
5 1 [0, 2, 0, 3, 4] False
6 0 [4, 3, 4, 1, 1] False
7 1 [2, 0, 0, 3, 1] True
8 2 [3, 3, 3, 2, 4] True
9 2 [3, 0, 0, 4, 1] False
10 0 [3, 3, 3, 4, 3] False
11 1 [0, 3, 3, 2, 1] True
测试数据上的性能:
答案 1 :(得分:2)
IIUC,例如:
Col1 Col2
0 0 [0, 1, 2]
1 1 [2, 3, 4]
2 2 [4, 5, 2]
您可以这样做:
df['Result'] = df.apply(lambda x: x.Col1 in x.Col2, axis = 1)
输出:
Col1 Col2 Result
0 0 [0, 1, 2] True
1 1 [2, 3, 4] False
2 2 [4, 5, 2] True
答案 2 :(得分:1)
IIUC isin
pd.DataFrame(df[1].values.tolist(),index=df.index).isin(df[0]).any(1)
答案 3 :(得分:1)
使用Numpy广播和any
样本为:
df:
Out[429]:
0 1
0 1 [0, 2, 2, 2, 0]
1 0 [0, 4, 3, 2, 4]
2 4 [4, 1, 0, 3, 2]
3 4 [1, 0, 1, 4, 1]
4 0 [3, 3, 1, 2, 2]
5 4 [0, 4, 2, 2, 0]
6 1 [2, 1, 1, 1, 0]
7 4 [0, 4, 2, 4, 0]
8 0 [4, 4, 4, 4, 4]
9 0 [4, 2, 3, 3, 1]
10 2 [0, 4, 2, 3, 2]
11 3 [1, 3, 2, 2, 1]
df['Flag_isin'] = (df[0].values[:, None] == np.vstack(df[1].values)).any(1)
Out[431]:
0 1 Flag_isin
0 1 [0, 2, 2, 2, 0] False
1 0 [0, 4, 3, 2, 4] True
2 4 [4, 1, 0, 3, 2] True
3 4 [1, 0, 1, 4, 1] True
4 0 [3, 3, 1, 2, 2] False
5 4 [0, 4, 2, 2, 0] True
6 1 [2, 1, 1, 1, 0] True
7 4 [0, 4, 2, 4, 0] True
8 0 [4, 4, 4, 4, 4] False
9 0 [4, 2, 3, 3, 1] False
10 2 [0, 4, 2, 3, 2] True
11 3 [1, 3, 2, 2, 1] True