有没有办法将bin范围列表设置为Pandas Dataframe的索引?

时间:2019-07-02 14:45:49

标签: python pandas indexing merge

我可以选择一些数据框来记录每日降雨量(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
...

我每年都使用“ groupby”功能生成DataFrames,在是否发生洪水之间进行划分,并为24H降雨间隔分配垃圾箱,如下所示:

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   

这很好地分割了数据,但是没有包括不满足条件的所有bin。我还有另外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之后的输出索引是CategoricalIndex,并且我想出了如何使用以下令人愉悦的低效率代码将索引更改为类别索引:

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 :(得分:0)

如果我理解正确,则可以使用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)