Найти первое значение в столбце большего размера, которое больше или равно каждому значению в более коротком столбце поиска. - PullRequest
0 голосов
/ 20 июня 2019

Я пытался найти векторизованный способ получения индекса первого значения в большом столбце (> 500 тыс. Строк), который больше или равен каждому значению в более коротком столбце (~ 9 тыс. Строк).

В настоящее время я перебираю каждое значение в более коротком столбце и сравниваю его со всем большим столбцом. Количество петель = длина более короткого столбца.

np.random.seed(2)

veclong = np.random.randint(0, 1000, 100000)
vecshort = np.random.randint(0, 1000, 500)
dfShort=pd.DataFrame(data=vecshort/10000, columns=['Short'])
dfLong=pd.DataFrame(data=veclong/10000, columns=['Long'])

c1=len(dfShort)

out2=[];
for n1 in range(c1):
    val=dfShort['Short'].iloc[n1]
    dfAns=dfLong[dfLong>=val].dropna()
    ans=dfAns['Long'].iloc[0]
    idx=dfAns.index[0]
    out=[ans,idx]
    out2.extend([out])

out2=np.asarray(out2)
dfShort['Location']=out2[:,1]
dfShort['Value']=out2[:,0]

1 Ответ

0 голосов
/ 21 июня 2019

Следует учитывать следующее:

def myfunc(x):
    try:    
        return dfLong[dfLong.Long>=x].index[0]
    except:
        return None

dfShort['Location'] = dfShort.Short.apply(lambda x: myfunc(x))
dfShort['Value'] = dfShort.Location.apply(lambda x: dfLong.iloc[x, 0] if x!= None else None)
print(dfShort.head())

Вывод

+----+---------+-----------+--------+
|    | Short   | Location  | Value  |
+----+---------+-----------+--------+
| 0  | 0.0636  |       10  | 0.0674 |
| 1  | 0.0876  |       27  | 0.0938 |
| 2  | 0.0799  |       16  | 0.0831 |
| 3  | 0.0977  |       95  | 0.0997 |
| 4  | 0.0602  |       10  | 0.0674 |
+----+---------+-----------+--------+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...