说我有一个熊猫数据框,其中有四列:A,B,C,D。
my_df = pd.DataFrame({'A': [0,1,4,9], 'B': [1,7,5,7],'C':[1,1,1,1],'D':[2,2,2,2]})
我也有一个元组列表:
my_tuples = [(0,1),(4,5),(9,9)]
我只想保留(my_df['A'],my_df['B'])
的值等于my_tuples中元组之一的数据帧的行。
在此示例中,该行将是第0行和第2行。
有没有很好的方法可以做到这一点?我将不胜感激。
答案 0 :(得分:4)
答案 1 :(得分:1)
我们也可以将DataFrame.loc
与map
一起使用。
my_df.loc[list(map(lambda x: x in my_tuples, zip(my_df['A'], my_df['B']))),:]
#my_df.loc[[row in my_tuples for row in zip(my_df['A'], my_df['B'])],:]
时间比较
%%timeit
my_df.loc[list(map(lambda x: x in my_tuples, zip(my_df['A'], my_df['B']))),:]
394 µs ± 24.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
df = my_df.merge(pd.DataFrame(my_tuples, columns=['A','B']))
3.56 ms ± 248 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df = my_df[my_df.set_index(['A','B']).index.isin(my_tuples)]
3.99 ms ± 139 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)