gpt4 book ai didi

python - pandas - 根据另一列中的值使用 bins 定义进行分箱

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:21 24 4
gpt4 key购买 nike

我正在努力完成这样的任务:我需要从数据框中离散化列中的值,并根据其他列中的值定义 bin。

对于一个最小的工作示例,让我们定义一个简单的数据框:

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

现在我想介绍 C 列,它将包含一个 bin 标签,A 列中的每个值都有不同的 bins,即:

  • (-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.cutnp.digitizemapapply 的不同组合,但没有成功。

目前,我通过拆分框架并将 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)

这可行,但我认为它不够优雅,我还预计生产中会出现一些速度或内存问题,届时我将拥有数百万行的帧。坦白说,我想这可以做得更好。

我会很感激任何帮助或想法...

最佳答案

这是否解决了您的问题?

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
'B' : np.random.randn(12)})
bins = {'one': (-10,-1,0,1,10), 'two':(-100,0,100), 'three':(-999,0,1,2,3)}

def func(row):
return pd.cut([row['B']], bins=bins[row['A']])[0]

df['C'] = df.apply(func, axis=1)

这将返回一个 DataFrame:

        A         B          C
0 one 1.440957 (1, 10]
1 one 0.394580 (0, 1]
2 two -0.039619 (-100, 0]
3 three -0.500325 (-999, 0]
4 one 0.497256 (0, 1]
5 one 0.342222 (0, 1]
6 two -0.968390 (-100, 0]
7 three -0.772321 (-999, 0]
8 one 0.803178 (0, 1]
9 one 0.201513 (0, 1]
10 two 1.178546 (0, 100]
11 three -0.149662 (-999, 0]

binnize 的更快版本:

def binize2(df):
df['C'] = ''
for key, values in bins.items():
mask = df['A'] == key
df.loc[mask, 'C'] = pd.cut(df.loc[mask, 'B'], bins=values)

%%timeit
df3 = binnize(df1)
10 loops, best of 3: 56.2 ms per loop

%%timeit
binize2(df2)
100 loops, best of 3: 6.64 ms per loop

这可能是因为它就地更改了 DataFrame 而没有创建新的。

关于python - pandas - 根据另一列中的值使用 bins 定义进行分箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com