У меня есть выборка данных для ежегодных записей суточных осадков (ppt_24H) и наводнений (Fld).Они выглядят так:
ppt_24H Fld
01-01-2006 0.2 0.0
01-02-2006 0.6 0.0
01-03-2006 0.0 0.0
01-04-2006 11.5 1.0
01-05-2006 10.4 0.0
...
Я сгенерировал DataFrames для каждого года с функцией 'groupby', разделив между тем, произошло ли наводнение или нет, и назначив ячейки для 24-часовых интервалов осадков следующим образом:
my_intervals = np.array([(-0.1,0),(0.0,0.25),(0.25,0.5),(0.5,1),(1,2),(2,4),(4,6),(6,8),(8,12),(12,16),(16,20),(20,25),(25,30),(30,35),(35,40),(40,45),(45,50),(50,np.inf)])
bins = np.append(my_intervals[:, 0], my_intervals[-1, 1])
Функция grouby выглядит следующим образом:
Y2006 = pd.DataFrame(TM_YEAR06.groupby([pd.cut(TM_YEAR06['ppt_24H'], bins), 'Fld']).size().unstack().fillna(0).astype(int))
Это успешно разбивает данные, говорящие мне, сколько дней, в течение которых количество осадков было между этими выбранными порогами, было связано с наводнением (помечено '1.0') или нет (помечено' 0.0 ').Ура.Однако индексирование варьируется в зависимости от того, имеются ли случаи дождя между каждым набором пороговых значений.Например, в течение одного года это выглядит следующим образом:
Fld 0.0 1.0
ppt_24H
(-0.1, 0.0] 46 1
(0.0, 1.0] 161 1
(1.0, 2.0] 62 0
(2.0, 3.0] 35 0
(3.0, 4.0] 11 1
(4.0, 5.0] 6 0
(5.0, 7.5] 14 0
(15.0, 20.0] 2 1
(25.0, 30.0] 2 0
(30.0, 40.0] 2 0
(60.0, 80.0] 2 0
Это позволяет аккуратно разделить данные, но не включает все ячейки, для которых условия не были выполнены.У меня есть еще 20 лет, которые мне нужно объединить в один и тот же DataFrame, который перенастраивает разные индексы, и ни один из них не имеет всех индексов.Например, вот еще один составленный пример с другими индексами:
Fld 0.0 1.0
ppt_24H
(-0.1, 0.0] 54 1
(0.0, 1.0] 144 1
(1.0, 2.0] 62 0
(2.0, 3.0] 35 0
(3.0, 4.0] 11 1
(4.0, 5.0] 6 0
(7.5, 10] 14 0
(15.0, 20.0] 2 1
(25.0, 30.0] 6 0
(80.0, 100.0] 2 0
До сих пор я пытался использовать список в my_intervals для индексации пустого фрейма данных «YALL», к которому я мог бы слить, но это делаетне работа.Вот код для того, что я пробовал:
YALL = pd.DataFrame(columns = [0.0 , 1.0], index=[(-0.1,0),(0.0,0.25),(0.25,0.5),(0.5,1),(1,2),(2,4),(4,6),(6,8),(8,12),(12,16),(16,20),(20,25),(25,30),(30,35),(35,40),(40,45),(45,50),(50,np.inf)])
Это делает, как я ожидал, создавая фрейм данных, полный NaN, но когда я пытаюсь объединить Y2006 с YALL, используя:
Y2006 = YALL.merge(Y2006,left_index=True, right_index=True,how='left').fillna(0)
Это выходит с этим ...:
Fld 0.0 1.0 0.0_x 1.0_x
ppt_24H
(-0.1, 0.0) 0 0 0 0
(0.0, 1.0) 0 0 0 0
(1.0, 2.0) 0 0 0 0
(2.0, 3.0) 0 0 0 0
(3.0, 4.0) 0 0 0 0
(4.0, 5.0) 0 0 0 0
(5.0, 7.5) 0 0 0 0
... and so on...
Не то, на что я надеялся ... Любые идеи о том, что я мог бы сделать?
РЕДАКТИРОВАТЬ:
Мне удалось выяснить, что выходной индекс после grouby был Категориальным индексом, и я решил, как изменить свой индекс на категогический индекс, используя этот восхитительно неэффективный код:
CatIndex = pd.Series([(-0.1,0),(0.0,0.25),(0.25,0.5),(0.5,1),(1,2),(2,4),(4,6),(6,8),(8,12),(12,16),(16,20),(20,25),(25,30),(30,35),(35,40),(40,45),(45,50),(50,np.inf)], dtype="category")
idx= pd.Index(CatIndex).astype('category')
YALL = pd.DataFrame(index=idx)
ОднакоТеперь я столкнулся с ошибкой:
ValueError: setting an array element with a sequence.
Для этой строки ...:
---> 30 Y2006 = YALL.merge(Y2006,left_index=True, right_index=True,how='left').fillna(0)
Квест продолжается ...