这是一个非常简单的娱乐活动,尽管实际DF有更多列
我的数据框:
length width height age
0 1 5 8 12
1 1 5 8 12
2 1 5 8 21
3 1 5 8 15
4 1 5 8 15
5 1 6 9 12
6 2 6 9 32
7 2 6 9 32
8 2 6 7 98
9 3 4 7 12
10 3 4 7 54
11 3 4 7 21
我想从哪里得到的行width == 6
和 age ==32
。
很简单:
d[(d['width']==6) & (d['age']==32)]
length width height age
6 2 6 9 32
7 2 6 9 32
有没有办法使它自动化呢?假设我有一个列和值的列表。在这种情况下,它仍然仍然只有两个列/值,但是我正在考虑处理15个或更多:
cols = ['width','age']
vals = [6,32]
现在构建一个空的数据框并使用以下命令更新行append
:
df_temp = pd.DataFrame()
for col,val in zip(cols,vals):
if df_temp.empty:
df_temp = df[df[col]==val]
else:
df_temp.append(df[df[col]==val])
length width height age
5 1 6 9 12
6 2 6 9 32
7 2 6 9 32
8 2 6 7 98
这等效于使用or
符号|
:
d[(d['width']==6) | (d['age']==32)]
我怎样才能做到这一点AND
而不是自动化or
呢?
我已经尝试了一些完全令人发指的方法,但是它没有用,它似乎仍然等同于|
而不是&
。
[d[(d[col]==val) & (d[col]==val)] for col, val in zip(cols,vals)][0]
length width height age
5 1 6 9 12
6 2 6 9 32
7 2 6 9 32
8 2 6 7 98
我的可复制数据框:
import pandas as pd
pd.DataFrame({'length': pd.Series([1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3],dtype='int64',index=pd.RangeIndex(start=0, stop=12, step=1)), 'width': pd.Series([5, 5, 5, 5, 5, 6, 6, 6, 6, 4, 4, 4],dtype='int64',index=pd.RangeIndex(start=0, stop=12, step=1)), 'height': pd.Series([8, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7],dtype='int64',index=pd.RangeIndex(start=0, stop=12, step=1)), 'age': pd.Series([12, 12, 21, 15, 15, 12, 32, 32, 98, 12, 54, 21],dtype='int64',index=pd.RangeIndex(start=0, stop=12, step=1))}, index=pd.RangeIndex(start=0, stop=12, step=1))
我们可以通过在此处使用基础的numpy数组来简化此操作:
df[(df[cols].values == vals).all(1)]
length width height age
6 2 6 9 32
7 2 6 9 32
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句