有没有办法将bin扩展数据块列表设置为数据帧的索引?

2024-06-16 14:44:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧的选择,用于每日降雨量(pptè24小时)和洪水事件(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”函数为每年生成数据帧,在是否发生洪水之间进行分割,并为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年,我需要合并到同一个数据帧,这是重新调整不同的索引,其中没有一个拥有所有的索引。例如,下面是另一个包含不同索引的虚构示例:

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\u interval'中的列表来索引一个空白的数据帧'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,然后我利用这个效率极低的代码,研究了如何将我的索引更改为categiocal索引:

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)

探索还在继续


Tags: 数据truedataframeindexmynpleftinf
1条回答
网友
1楼 · 发布于 2024-06-16 14:44:40

如果我理解正确,您可以使用^{}作为您的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)

然后使用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)

相关问题 更多 >