我有一个objects
表和lookup
表。在objects
表中,我希望添加lookup
表中大于对象的number
的最小值。
我发现了这个类似的问题,但它是关于找到一个大于常数的值,而不是每行都改变。
代码中:
import pandas as pd
objects = pd.DataFrame([{"id": 1, "number": 10}, {"id": 2, "number": 30}])
lookup = pd.DataFrame([{"number": 3}, {"number": 12}, {"number": 40}])
expected = pd.DataFrame(
[
{"id": 1, "number": 10, "smallest_greater": 12},
{"id": 2, "number": 30, "smallest_greater": 40},
]
)
首先将objects['number']
的每个值lookup['number']
与2d布尔掩码进行比较,然后将cumsum
相加,并将第一个值1
进行比较,并通过numpy.argmax
获得lookup['number']
设置值的位置。
使用numpy.where
生成输出,用于将所有不匹配的值覆盖到NaN
。
objects = pd.DataFrame([{"id": 1, "number": 10}, {"id": 2, "number": 30},
{"id": 3, "number": 100},{"id": 4, "number": 1}])
print (objects)
id number
0 1 10
1 2 30
2 3 100
3 4 1
m1 = lookup['number'].values >= objects['number'].values[:, None]
m2 = np.cumsum(m1, axis=1) == 1
m3 = np.any(m1, axis=1)
out = lookup['number'].values[m2.argmax(axis=1)]
objects['smallest_greater'] = np.where(m3, out, np.nan)
print (objects)
id number smallest_greater
0 1 10 12.0
1 2 30 40.0
2 3 100 NaN
3 4 1 3.0
smallest_greater=[]
对于对象中的i['number']: nbsp nbsp smallest_greater.append