[英]Python pandas dataframe: Find last occurrence of value less-than-or-equal-to current row
我有2個熊貓數據框:
DF1:
ksat muacres SAND SILT CLAY
0 5326 0 0 0
0.1 4346 0 0 0
0.4 4146 0 0 0
0.8 3476 0 0 0
1.2 2006 0 0 0
和df2:
PERCENTILE ksat b theta
0 1 0.370684 11.55 46.8
1 2 0.558053 11.55 46.8
2 3 0.794836 10.39 46.8
3 4 0.962329 11.55 46.8
4 5 1.202368 10.39 46.8
我想在df1中添加一列'st',在df1中的每一行中,我都會在df2中找到ksat值,該值大於或等於df1中的ksat值。 對於此示例,結果將是:
DF1:
ksat muacres SAND SILT CLAY st
0 5326 0 0 0 1
0.1 4346 0 0 0 1
0.4 4146 0 0 0 2
0.8 3476 0 0 0 4
1.2 2006 0 0 0 5
目前,我正在一個循環中循環,但這效率很低。 熊貓有更好的方法嗎?
謝謝!
一種方法是合並兩次。 首先只包含百分比列,這樣您就可以向后填充:
In [11]: merged = df1[['ksat']].merge(df2[['ksat', 'PERCENTILE']], how='outer', sort=True)
In [12]: merged
Out[12]:
ksat PERCENTILE
0 0.000000 NaN
1 0.100000 NaN
2 0.370684 1
3 0.400000 NaN
4 0.558053 2
5 0.794836 3
6 0.800000 NaN
7 0.962329 4
8 1.200000 NaN
9 1.202368 5
In [13]: merged.bfill()
Out[13]:
ksat PERCENTILE
0 0.000000 1
1 0.100000 1
2 0.370684 1
3 0.400000 2
4 0.558053 2
5 0.794836 3
6 0.800000 4
7 0.962329 4
8 1.200000 5
9 1.202368 5
然后合並以下結果:
In [14]: df.merge(merged.bfill())
Out[14]:
ksat muacres SAND SILT CLAY PERCENTILE
0 0.0 5326 0 0 0 1
1 0.1 4346 0 0 0 1
2 0.4 4146 0 0 0 2
3 0.8 3476 0 0 0 4
4 1.2 2006 0 0 0 5
你可以嘗試numpy.searchsorted
df1['st'] = np.searchsorted(df2.ksat, df1.ksat, side='left') + 1
如果PERCENTILE
值不是序數,則有一個額外的步驟:
idx = np.searchsorted(df2.ksat, df1.ksat, side='left')
df1['st'] = df2.PERCENTILE[idx].values
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.