我想按20,20到24,25到30以及30以下的年龄组拆分数据框。我可以用一个数组和一个范围迭代器来做它,但我想知道是否有一个更好的方法来做到这一点。
gates = [0,20,25,30,50]
total = df.agepreg.isnull().sum()
print("INAPPLICABLE {0}".format(total))
for i in range(0, 4):
t = df.agepreg[(df.agepreg>=gates[i]) & (df.agepreg<gates[i+1])].value_counts().sum()
print("{0} to {1} {2}".format(gates[i], gates[i+1], t))
total += t
print("Total {0}".format(total))
结果看起来像这样
INAPPLICABLE 352
0 to 20 3182
20 to 25 4246
25 to 30 3178
30 to 50 2635
Total 13593
此数据来自nsfg。免费图书thinkstats2包含github上的随附代码和数据。
来自&#39;代码&#39;目录,您可以运行以下行来加载数据帧。
import nsfg
df = nsfg.ReadFemPreg()
df
答案 0 :(得分:0)
您可以在groupby
pd.cut(df['agrpreg'], [20,24,25,30,pd.np.inf], right=False)
创建一个包含100行且值介于20和35之间的数据框
In [643]: df = pd.DataFrame(pd.np.random.randint(20, 35, 100), columns=['agrpreg'])
In [644]: df_cuts = (df
.groupby(pd.cut(df['agrpreg'], [20,24,25,30,pd.np.inf], right=False))
.sum())
In [645]: df_cuts
Out[645]:
agrpreg
agrpreg
[20, 24) 532
[24, 25) 192
[25, 30) 878
[30, inf) 1093
检查两者的总和是否匹配。
In [646]: df_cuts.sum() == df['agrpreg'].sum()
Out[646]:
agrpreg True
dtype: bool
要了解pd.cut
的作用,请将每个值存储到容器中。
In [647]: df[:5]
Out[647]:
agrpreg
0 29
1 25
2 22
3 28
4 23
In [648]: pd.cut(df['agrpreg'], [20,24,25,30,pd.np.inf], right=False)[:5]
Out[648]:
0 [25, 30)
1 [25, 30)
2 [20, 24)
3 [25, 30)
4 [20, 24)
Name: agrpreg, dtype: category
Categories (4, object): [[20, 24) < [24, 25) < [25, 30) < [30, inf)]