蟒蛇& pandas:如何将数据框拆分为组

时间:2015-10-17 07:38:32

标签: python pandas

我想按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

1 个答案:

答案 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)]