首页 > 解决方案 > 如何通过两个限制之间的列值索引数据框

问题描述

我希望能够通过按数据框一列中的所需值索引数据框来制作数据框的较小子集。

代码

import pandas as pd 
import numpy as np

data = [['Alex',15,4],['Bob',5,1],['Clarke',13,2],['dan',6,2],['eve',19,1],['fin',12,1],['ginny',11,2],['hal',14,1],['ian',13,3],['jen',9,1] ]
df = pd.DataFrame(data,columns=['Name','Age','Pets'])
print (df)

lo = 10
hi = 14
lo_range = df[df['Age']>=lo]
print('lo_range:', lo_range)
mid_range = df[hi>= df['Age']>=lo]
print('mid_range:', mid_range)

我发现了如何做到这一点:

mid_range = df[( df['Age']>=lo) & (df['Age']>=hi)]

标签: pythonpandasdataframeindexing

解决方案


另一种方法是将 apply 与 lambda 一起使用:

mid_range = df[df['Age'].apply(lambda x: x in range(lo,hi+1))]

在测量将 apply 与 lambda 和&运算符一起使用的执行时间时,我注意到 apply lambda 有点快!

start_time = time.time()
mid_range = df[df['Age'].apply(lambda x: x in range(lo,hi+1))]
end_time = time.time()

'mid_range:',      Name  Age  Pets
2  Clarke   13     2
5     fin   12     1
6   ginny   11     2
7     hal   14     1
8     ian   13     3

"execution time(sec): 0.0006139278411865234"


start_time = time.time()
mid_range =  df[( df['Age']>=lo) & (df['Age']<=hi)]
end_time = time.time()

'mid_range:',      Name  Age  Pets
2  Clarke   13     2
5     fin   12     1
6   ginny   11     2
7     hal   14     1
8     ian   13     3

"execution time(sec): 0.0015518665313720703"

因此,如果您的数据框中只有几个条目可能并不重要,但如果您的表中恰好有几百万个条目,它真的会有所作为!


推荐阅读