我正在努力完成这样的任务:我需要从数据框中离散化列中的值,并根据其他列中的值定义 bins。
对于一个最小的工作示例,让我们定义一个简单的数据框:
import pandas as pd
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,'B' : np.random.randn(12)})
数据框如下所示:
A B
0 one 2.5772143847077427
1 one -0.6394141654096013
2 two 0.964652049995486
3 three -0.3922889559403503
4 one 1.6903991754896424
5 one 0.5741442025742018
6 two 0.6300564981683544
7 three 0.9403680915507433
8 one 0.7044433078166983
9 one -0.1695006646595688
10 two 0.06376190217285167
11 three 0.277540580579127
现在我想介绍 column C
,它将包含一个 bin 标签,对于 column 中的每个值都有不同的 bin A
,即:
(-10,-1,0,1,10)
对于A == 'one'
,(-100,0,100)
对于A == 'two'
,(-999,0,1,2,3)
为A == 'three'
.
期望的输出是:
A B C
0 one 2.5772143847077427 (1, 10]
1 one -0.6394141654096013 (-1, 0]
2 two 0.964652049995486 (0, 100]
3 three -0.3922889559403503 (-999, 0]
4 one 1.6903991754896424 (1, 10]
5 one 0.5741442025742018 (0, 1]
6 two 0.6300564981683544 (0, 100]
7 three 0.9403680915507433 (0, 1]
8 one 0.7044433078166983 (0, 1]
9 one -0.1695006646595688 (-1, 0]
10 two 0.06376190217285167 (0, 100]
11 three 0.277540580579127 (0, 1]
我曾尝试使用pd.cut
ornp.digitize
与 , 的不同组合map
,apply
但没有成功。
目前,我通过拆分框架并pd.cut
分别应用于每个子集,然后合并以获取框架来实现结果,如下所示:
values_in_column_A = df['A'].unique().tolist()
bins = {'one':(-10,-1,0,1,10),'two':(-100,0,100),'three':(-999,0,1,2,3)}
def binnize(df):
subdf = []
for i in range(len(values_in_column_A)):
subdf.append(df[df['A'] == values_in_column_A[i]])
subdf[i]['C'] = pd.cut(subdf[i]['B'],bins[values_in_column_A[i]])
return pd.concat(subdf)
这可行,但我认为它不够优雅,我还预计生产中会出现一些速度或内存问题,当我将拥有数百万行的帧时。直说吧,我想这可以做得更好。
我将不胜感激任何帮助或想法...