对于以下数据帧,我想将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
答案 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