Расширение фрейма данных pandas с диапазоном массива numpy

#python #pandas

#python #pandas

Вопрос:

У меня есть следующий фрейм данных (образец):

         min   max    lat    lon
16744  1000  1000  60.75  25.75
18738   875   950  64.00  13.75
2811    925  1000  41.00  20.00
12361  1000  1000  54.00  -1.25
19257  1000  1000  64.75  42.00
  

и массив pressure :

 pressure=['1000','975','950','925','900','875','850','825','800','775','750','700','650']
  

Я хочу расширить фрейм данных строками со значениями уровня давления на основе диапазона от min до max значений. Добавление должно быть сделано на основе pressure элементов массива. Т.е., если min , max 1000 , 1000 , новая строка со значением 975 должна быть добавлена со всеми остальными ячейками, такими же, как и исходная запись.
Я частично решил эту проблему, но не с помощью pandas, и теперь у меня проблемы с производительностью из-за большого фрейма данных.
Вот что я сделал:

 mini=sample['min'].to_numpy()
maksi=sample['max'].to_numpy()            
for i, ma in enumerate(maksi):
    poc=np.where(pressure==ma)
    kr=np.where(pressure==mini[i])
    if poc[0][0]==0:
        pk=0
    else:
        pk=-1
    if kr[0][0]==len(pressure):
        kk=0
    else:
        kk=2
    pock=poc[0][0] pk
    kraj=kr[0][0] kk
    pk=0
    kk=0
    levels=pressure[pock:kraj]
    print(levels)
  

и распечатка приведенного выше кода:

 [1000  975]
[975 950 925 900 875 850]
[1000  975  950  925  900]
[1000  975]
[1000  975]
  

Что мне нужно сделать, так это интегрировать вышеуказанные массивы в записи примерного фрейма данных.

Желаемый результат:

         pre   lat    lon
16744  1000  60.75  25.75
16744   975  60.75  25.75
18738   975  64.00  13.75
18738   950  64.00  13.75
18738   900  64.00  13.75
18738   875  64.00  13.75
18738   850  64.00  13.75
2811   1000  41.00  20.00
2811    975  41.00  20.00
2811    950  41.00  20.00
2811    925  41.00  20.00
2811    900  41.00  20.00
12361  1000  54.00  -1.25
12361   975  54.00  -1.25
19257  1000  64.75  42.00
19257   975  64.75  42.00
  

Могу ли я сделать все это векторным способом — только pandas? Любая помощь приветствуется.

Комментарии:

1. Какова логика «если min, max равны 1000,1000, новая строка со значением 975»

2. Просто любопытно, почему ваш pressure массив представляет собой массив строк?

3. Я сделал рабочую выдержку из гораздо большего кода.

4. @это Крис, если оба значения равны 1000, мне нужно увеличить давление на 975. Кроме того, если минимальные максимальные значения равны 875 и 950, мне нужно распространить его на соседние элементы массива давления. Аналогичная логика применяется ко всем строкам.

Ответ №1:

Давайте перекрестно объединим и отфильтруем:

 (df.assign(min=lambda x: x['min']-25,dummy=1)
   .reset_index()
   .merge(pd.DataFrame({'pre':pressure, 'dummy':1}).astype(int),
          on='dummy')
   .loc[lambda x: x['pre'].between(x['min'],x['max'])]
   .set_index('index')
   .reindex(['pre','lat','lon'], axis=1)
)
  

Вывод:

         pre    lat    lon
index                    
16744  1000  60.75  25.75
16744   975  60.75  25.75
18738   950  64.00  13.75
18738   925  64.00  13.75
18738   900  64.00  13.75
18738   875  64.00  13.75
18738   850  64.00  13.75
2811   1000  41.00  20.00
2811    975  41.00  20.00
2811    950  41.00  20.00
2811    925  41.00  20.00
2811    900  41.00  20.00
12361  1000  54.00  -1.25
12361   975  54.00  -1.25
19257  1000  64.75  42.00
19257   975  64.75  42.00
  

Комментарии:

1. Это здорово. Один вопрос, будет ли он работать с любым возможным значением от min max? Min max может принимать любое значение из массива давления. Обратите внимание, что последние три элемента из pressure разнесены на 50.