我有一个带有多个列的pandas数据框,它们在最后一列中标记了数据,例如,
df = pd.DataFrame( {'1_label' : ['a1','b1','c1','d1'],
'2_label' : ['a2','b2','c2','d2'],
'3_label' : ['a3','b3','c3','d3'],
'data' : [1,2,3,4]})
df = 1_label 2_label 3_label data
0 a1 a2 a3 1
1 b1 b2 b3 2
2 c1 c2 c3 3
3 d1 d2 d3 4
以及元组列表,
list_t = [('a1','a2','a3'), ('d1','d2','d3')]
我想过滤此数据框并返回一个仅包含与列表中元组相对应的行的新数据框。
result = 1_label 2_label 3_label data
0 a1 a2 a3 1
1 d1 d2 d3 4
我的幼稚(和C ++启发)解决方案是使用append(例如vector :: push_back)
for l1, l2, l3 in list_t:
if df[(df['1_label'] == l1) &
(df['2_label'] == l2) &
(df['3_label'] == l3)].empty is False:
result = result.append(df[(df['1_label'] == l1) &
(df['2_label'] == l2) &
(df['3_label'] == l3)]
虽然我的解决方案有效,但我怀疑大数据框和大元组列表的速度太慢了,因为我认为熊猫会在每次追加调用时创建一个新的数据框。有人可以建议一种更快/更清洁的方法吗?谢谢!
假设没有重复项,则可以在要“过滤”的列上创建索引:
In [10]: df
Out[10]:
1_label 2_label 3_label data
0 a1 a2 a3 1
1 b1 b2 b3 2
2 c1 c2 c3 3
3 d1 d2 d3 4
In [11]: df.set_index(['1_label', '2_label', '3_label'])\
.loc[[('a1','a2','a3'), ('d1','d2','d3')]]\
.reset_index()
Out[11]:
1_label 2_label 3_label data
0 a1 a2 a3 1
1 d1 d2 d3 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句