首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据熊猫的不同价值进行分组?

如何根据熊猫的不同价值进行分组?
EN

Stack Overflow用户
提问于 2016-03-20 18:58:57
回答 2查看 8.6K关注 0票数 4

我有一个dataframe,我想根据分类变量和一系列值对其进行分组。您可能会把它看作是类似值的行(集群?)。例如:

代码语言:javascript
运行
复制
df = pd.DataFrame({'symbol' : ['IP', 'IP', 'IP', 'IP', 'IP', 'IP', 'IP'],
                   'serie' : ['A', 'B', 'A', 'B', 'A', 'B', 'B'],
                   'strike' : [10, 10, 12, 13, 12, 13, 14],
                   'last' : [1, 2, 2.5, 3, 4.5, 5, 6],
                   'price' : [11, 11, 11, 11, 11, 11, 11],
                   'type' : ['call', 'put', 'put', 'put', 'call', 'put', 'call']})

如果我用

代码语言:javascript
运行
复制
grouped = df.groupby(['symbol', 'serie', 'strike'])

我的部分问题已经得到解决,但我想结合更接近的罢工值,例如10和11、12和13等等。最好在%范围内。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-20 19:49:06

我猜OP想要按分类变量分组,然后是以间隔为单位的数值变量。在这种情况下,您可以使用np.digitize()

代码语言:javascript
运行
复制
smallest = np.min(df['strike'])
largest = np.max(df['strike'])
num_edges = 3
# np.digitize(input_array, bin_edges)
ind = np.digitize(df['strike'], np.linspace(smallest, largest, num_edges))

那么ind应该是

代码语言:javascript
运行
复制
array([1, 1, 2, 2, 2, 2, 3], dtype=int64)

与绑定对应的

代码语言:javascript
运行
复制
 [10, 10, 12, 13, 12, 13, 14]

带桶边

代码语言:javascript
运行
复制
array([ 10.,  12.,  14.]) # == np.linspace(smallest, largest, num_edges)

最后,按所需的所有列分组,但使用此额外的bin列。

代码语言:javascript
运行
复制
df['binned_strike'] = ind
for grp in df.groupby(['symbol', 'serie', 'binned_strike']):
    print "group key"
    print grp[0]
    print "group content"
    print grp[1]
    print "============="

这个应该打印出来

代码语言:javascript
运行
复制
group key
('IP', 'A', 1)
group content
   last  price serie  strike symbol  type  binned_strike
0   1.0     11     A      10     IP  call              1
=============
group key
('IP', 'A', 2)
group content
   last  price serie  strike symbol  type  binned_strike
2   2.5     11     A      12     IP   put              2
4   4.5     11     A      12     IP  call              2
=============
group key
('IP', 'B', 1)
group content
   last  price serie  strike symbol type  binned_strike
1   2.0     11     B      10     IP  put              1
=============
group key
('IP', 'B', 2)
group content
   last  price serie  strike symbol type  binned_strike
3   3.0     11     B      13     IP  put              2
5   5.0     11     B      13     IP  put              2
=============
group key
('IP', 'B', 3)
group content
   last  price serie  strike symbol  type  binned_strike
6   6.0     11     B      14     IP  call              3
=============
票数 1
EN

Stack Overflow用户

发布于 2016-03-20 20:00:00

groupy()的垃圾箱上做strike

使用pd.cut创建大量罢工数据,然后按该信息分组:

代码语言:javascript
运行
复制
# Create DataFrame
df = pd.DataFrame({
    'symbol' : ['IP', 'IP', 'IP', 'IP', 'IP', 'IP', 'IP'],
    'serie' : ['A', 'B', 'A', 'B', 'A', 'B', 'B'],
    'strike' : [10, 10, 12, 13, 12, 13, 14],
    'last' : [1, 2, 2.5, 3, 4.5, 5, 6],
    'price' : [11, 11, 11, 11, 11, 11, 11],
    'type' : ['call', 'put', 'put', 'put', 'call', 'put', 'call']
})
# Create Bins (example three bins across data)
df['strikebins'] = pd.cut(df['strike'], bins=3)

print 'Binned DataFrame:'
print df
print

# Group these DataFrame
grouped = df.groupby(['symbol', 'serie', 'strikebins'])

# Do something with groups for example
gp_sum = grouped.sum()

print 'Grouped Sum (for example):'
print gp_sum
print
代码语言:javascript
运行
复制
Binned DataFrame:
   last  price serie  strike symbol  type        strikebins
0   1.0     11     A      10     IP  call   (9.996, 11.333]
1   2.0     11     B      10     IP   put   (9.996, 11.333]
2   2.5     11     A      12     IP   put  (11.333, 12.667]
3   3.0     11     B      13     IP   put      (12.667, 14]
4   4.5     11     A      12     IP  call  (11.333, 12.667]
5   5.0     11     B      13     IP   put      (12.667, 14]
6   6.0     11     B      14     IP  call      (12.667, 14]

Grouped Sum (for example):
                               last  price  strike
symbol serie strikebins                           
IP     A     (9.996, 11.333]      1     11      10
             (11.333, 12.667]     7     22      24
             (12.667, 14]       NaN    NaN     NaN
       B     (9.996, 11.333]      2     11      10
             (11.333, 12.667]   NaN    NaN     NaN
             (12.667, 14]        14     33      40

如果你想的话你可以用drop() strike,或者用范围的平均值代替strikebins .

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36118122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档