Есть ли способ установить список экстентов бина как индекс Dataframe Pandas? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть выборка данных для ежегодных записей суточных осадков (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)

Квест продолжается ...

1 Ответ

0 голосов
/ 06 июля 2019

Если я правильно понимаю, вы можете использовать IntervalIndex в качестве bins:

my_intervals = [(-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 = pd.IntervalIndex.from_tuples(my_intervals)

Затем выполните ту же операцию, которую вы делали до, а затем reindex с IntervalIndex:

Y2006 = TM_YEAR06.groupby([pd.cut(TM_YEAR06['ppt_24H'], bins), 'Fld']) \
                 .size().unstack().fillna(0).astype(int)
Y2006 = Y2006.reindex(bins, fill_value=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...