#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.