我试图找到我的问题的答案,但也许我并没有正确地将解决方案应用于我的情况。这就是我创建的将数据表中的某些行分组为收入组的方法。我创建了4个新的数据帧,然后在为每个数据帧应用索引后将它们连接起来。这是最优还是有更好的方法吗?
我应该添加我的目标是使用这些新组和boxpot创建一个箱线图" by ="参数。
df_nonull1 = df_nonull[(df_nonull['mn_earn_wne_p6'] < 20000)]
df_nonull2 = df_nonull[(df_nonull['mn_earn_wne_p6'] >= 20000) & (df_nonull['mn_earn_wne_p6'] < 30000)]
df_nonull3 = df_nonull[(df_nonull['mn_earn_wne_p6'] >= 30000) & (df_nonull['mn_earn_wne_p6'] < 40000)]
df_nonull4 = df_nonull[(df_nonull['mn_earn_wne_p6'] >= 40000)]
df_nonull1['inc_index'] = 1
df_nonull2['inc_index'] = 2
df_nonull3['inc_index'] = 3
df_nonull4['inc_index'] = 4
frames = [df_nonull1,df_nonull2,df_nonull3,df_nonull4]
results = pd.concat(frames)
答案 0 :(得分:2)
如果您的所有值都在10k到50k之间,则可以使用整数除法(//)指定索引:
df_nonull['inc_index'] = df_nonull.mn_earn_wne_p6 // 10000
您不需要分解数据框并将其连接起来,您需要找到一种方法从inc_index
字段创建mn_earn_wne_p6
。
答案 1 :(得分:1)
编辑。正如保罗在评论中所提到的那样,有一个pd.cut
功能正是这种事情,它比我原来的答案要优雅得多。
# equal-width bins
df['inc_index'] = pd.cut(df.A, bins=4, labels=[1, 2, 3, 4])
# custom bin edges
df['inc_index'] = pd.cut(df.A, bins=[0, 20000, 30000, 40000, 50000],
labels=[1, 2, 3, 4])
请注意labels
参数是可选的。 pd.cut
生成ordered categorical Series
,因此无论标签如何,您都可以按结果列进行排序:
df = pd.DataFrame(np.random.randint(1, 20, (10, 2)), columns=list('AB'))
df['inc_index'] = pd.cut(df.A, bins=[0, 7, 13, 15, 20])
print df.sort_values('inc_index')
输出(模数随机数)
A B inc_index
6 2 16 (0, 7]
7 5 5 (0, 7]
3 12 6 (7, 13]
4 10 8 (7, 13]
5 9 13 (7, 13]
1 15 10 (13, 15]
2 15 7 (13, 15]
8 15 13 (13, 15]
0 18 10 (15, 20]
9 16 12 (15, 20]
原始解决方案。这是Alexander's answer对可变广告系列宽度的概括。您可以使用inc_index
构建Series.apply
列。例如,
def bucket(v):
# of course, the thresholds can be arbitrary
if v < 20000:
return 1
if v < 30000:
return 2
if v < 40000:
return 3
return 4
df['inc_index'] = df.mn_earn_wne_p6.apply(bucket)
或者,如果你真的想避开def
,
df['inc_index'] = df.mn_earn_wne_p6.apply(
lambda v: 1 if v < 20000 else 2 if v < 30000 else 3 if v < 40000 else 4)
请注意,如果您只想将mn_earn_wne_p6
的范围细分为相等的存储桶,那么亚历山大的方式会更清晰,更快。
df['inc_index'] = df.mn_earn_wne_p6 // bucket_width
然后,要生成所需的结果,您只需按此列排序即可。
df.sort_values('inc_index')
您还可以groupby('inc_index')
汇总每个广告资源中的结果。