pandas cut and apply:系列的意外行为

时间:2017-02-07 08:08:09

标签: python pandas

对于以下数据帧,我想将w.r.t分组为freq列,对数据进行分区并对每个bin的计数数据求和。

示例数据看起来像这样

df = pd.DataFrame({"freq":[1,2,3], "count": [10,25,3]})
print(df)
   count  freq
0     10     1
1     25     2
2      3     3

要剪切数据,我使用

pd.cut(df.freq, bins=[0,1, np.infty])

带输出

0      (0, 1]
1    (1, inf]
2    (1, inf]
Name: freq, dtype: category
Categories (2, object): [(0, 1] < (1, inf]]

所以一切都按预期工作。但是,现在我想在相应的bin上映射df的freq列。我认为,这可以通过申请来实现。 但是,使用以下方式申请

df.freq.apply(lambda x: pd.cut(x, bins=[0,1, np.infty]))

产生TypeError

TypeError: putmask() argument 1 must be numpy.ndarray, not numpy.int64

但是,当我强制执行df.freq是一个DataFrame

pd.DataFrame(df.freq).apply(lambda x: pd.cut(x, bins=[0,1, np.infty]))

返回根据到箱子的映射的预期输出

       freq
0    (0, 1]
1  (1, inf]
2  (1, inf]

那么为什么在这里需要从Series-type转换的Dataframe? TypeError提示期望的数组是整数。但是,检查pandas.tile._bin_to_cut函数我还没有看到这种行为来自何处。

有任何建议或是否有意?

顺便说一句。使用python 3.6和pandas 0.19.2

1 个答案:

答案 0 :(得分:1)

我认为apply不是必需的,只需要groupby归待Series,它返回函数cut

print (type(pd.cut(df.freq, bins=[0,1, np.infty])))
<class 'pandas.core.series.Series'>

print (df.groupby(pd.cut(df.freq, bins=[0,1, np.infty]))['count'].sum().reset_index())
       freq  count
0    (0, 1]     10
1  (1, inf]     28

您还可以将输出分配给新列:

df['freq'] = pd.cut(df.freq, bins=[0,1, np.infty])
print (df)

   count      freq
0     10    (0, 1]
1     25  (1, inf]
2      3  (1, inf]

print (df.groupby('freq')['count'].sum().reset_index())
       freq  count
0    (0, 1]     10
1  (1, inf]     28
df = df.assign(freq=pd.cut(df.freq, bins=[0,1, np.infty]))
print (df)
   count      freq
0     10    (0, 1]
1     25  (1, inf]
2      3  (1, inf]

print (df.groupby('freq')['count'].sum().reset_index())
       freq  count
0    (0, 1]     10
1  (1, inf]     28