pandas 如何使用每一行的值作为比较对象来获得整个DataFrame中满足条件的行数?

wvt8vs2t  于 2023-02-02  发布在  其他
关注(0)|答案(1)|浏览(124)
date    data1
0   2012/1/1    100
1   2012/1/2    109
2   2012/1/3    108
3   2012/1/4    120
4   2012/1/5    80
5   2012/1/6    130
6   2012/1/7    100
7   2012/1/8    140

给定上面的 Dataframe ,我想获得data1值在每行data1字段± 10之间的行数,并将该计数附加到每行,如下所示:

date    data    Count
0   2012/1/1    100.0   4.0
1   2012/1/2    109.0   4.0
2   2012/1/3    108.0   4.0
3   2012/1/4    120.0   2.0
4   2012/1/5    80.0    1.0
5   2012/1/6    130.0   3.0
6   2012/1/7    100.0   4.0
7   2012/1/8    140.0   2.0

因为每行的字段都是rule的比较对象,所以我使用iterrows,尽管我知道这并不优雅:

result = pd.DataFrame(index=df.index)

for i,r in df.iterrows():
    high=r['data']+10
    low=r['data1']-10
    df2=df.loc[(df['data']<=r['data']+10)&(df['data']>=r['data']-10)]
    result.loc[i,'date']=r['date']
    result.loc[i,'data']=r['data']
    result.loc[i,'count']=df2.shape[0]  
  
result

有没有其他Pandas式的方法可以做到这一点?谢谢你的帮助!

j0pj023g

j0pj023g1#

对布尔掩码和计数True使用numpy广播,使用sum

arr = df['data'].to_numpy()

df['count'] = ((arr[:, None] <= arr+10)&(arr[:, None] >= arr-10)).sum(axis=1)
print (df)
       date  data  count
0  2012/1/1   100      4
1  2012/1/2   109      4
2  2012/1/3   108      4
3  2012/1/4   120      2
4  2012/1/5    80      1
5  2012/1/6   130      3
6  2012/1/7   100      4
7  2012/1/8   140      2

相关问题