在 Pandas 中,如何对浮点数进行装箱并对来自其他列的字符串类型进行计数,其中装箱具有恒定大小的滚动、重叠的数字范围?

问题描述 投票:0回答:1

我有一个浮点值和字符串表,如下所示:

FltVal 类别
0.01 A
0.02 A
0.05 B
0.31 B
0.36 A
0.37 C
0.41 B

我想生成一个新的数据框,将浮点值分箱到大小为 0.3 的箱中(因此每个箱都是 (x, x + 0.3]),并且以 0.01 的增量重叠。此外,我想要一列来统计进入垃圾箱的记录,以及统计垃圾箱每个“类别”总数的列。

我首先尝试使用 groupby 和 pd.cut 获得基本计数(在尝试查找每个类别的计数之前):

import pandas as pd

floats = pd.Series([0.01,0.02,0.05,0.31,0.36,0.37,0.41])
categories = pd.Series(['A','A','B','B','A','C','B'])
data = {"FltVal": floats, "Category": categories}
df = pd.concat(data, axis=1)

grouped_vals = df.groupby(pd.cut(df['FltVal'],np.arange(df['FltVal'].min(),df['FltVal'].max(),0.3))).count()

输出:

FltVal  Category
FltVal  
(0.01, 0.31]       3         3

我认为问题在于它无法考虑另一个垃圾箱,更不用说重叠了?

然后,带着我可以随后扔掉不合理(如负数)范围的想法,我尝试了以下方法:

FltVal_range = np.arange(df['FltVal'].min(),df['FltVal'].max(),0.01)
FltVal_range_from = FltVal_range - 0.3
FltVal_range_to = FltVal_range
FltVal_intervals = pd.IntervalIndex.from_arrays(FltVal_range_from,FltVal_range_to)
binned_df = df.groupby(pd.cut(df['FltVal'], FltVal_intervals))

但收到 ValueError 消息:

Overlapping IntervalIndex is not accepted.

如果 pd.cut 不接受重叠的垃圾箱,我想这是不可能的。

无论如何,所需的输出如下:

浮动垃圾桶 猫_A 猫_B 猫_C
0.00, 0.30 3 2 1 0
0.01、0.31 3 1 2 0
0.02、0.32 2 0 2 0
0.03, 0.33 2 0 2 0
0.04、0.34 2 0 2 0
0.05、0.35 1 0 1 0
0.06、0.36 2 1 1 0
0.07, 0.37 3 1 1 1
0.08、0.38 3 1 1 1
0.09、0.39 3 1 1 1
0.1、0.4 3 1 1 1
0.11、0.41 4 1 2 1

有效的方法是必要的,因为实际的数据帧将有数十万到数百万行。

我正在考虑类似于这个答案的东西,但适合查找我所有类别的计数。

非常感谢所有帮助!

pandas overlapping binning
1个回答
0
投票

使用

janitor
conditional_join
的一个选项:

import janitor

FltVal_range = np.arange(df['FltVal'].min(), df['FltVal'].max(), 0.01)

tmp = (pd.crosstab(df['FltVal'], df['Category'],
                   margins=True, margins_name='Count')
         .drop('Count')
       )

out = (pd.DataFrame({'low': FltVal_range, 'high': FltVal_range+0.3})
         .conditional_join(tmp.reset_index(),
                           ('low', 'FltVal', '<'),
                           ('high', 'FltVal', '>='))
         .groupby(['low', 'high'])[list(tmp)].sum()
      )

输出:

           A  B  C  Count
low  high                
0.01 0.31  1  2  0      3
0.02 0.32  0  2  0      2
0.03 0.33  0  2  0      2
0.04 0.34  0  2  0      2
0.05 0.35  0  1  0      1
0.06 0.36  1  1  0      2
0.07 0.37  1  1  1      3
0.08 0.38  1  1  1      3
0.09 0.39  1  1  1      3
0.10 0.40  1  1  1      3
0.11 0.41  1  2  1      4
0.12 0.42  1  2  1      4
0.13 0.43  1  2  1      4
0.14 0.44  1  2  1      4
0.15 0.45  1  2  1      4
...
© www.soinside.com 2019 - 2024. All rights reserved.