首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dataframe不返回期望的结果。

Dataframe不返回期望的结果。
EN

Stack Overflow用户
提问于 2016-11-22 20:05:35
回答 1查看 58关注 0票数 2
代码语言:javascript
运行
复制
df = pd.DataFrame( {
   'A':  ['d','d','d','d','d','d','g','g','g','g','g','g','k'
    ,'k','k','k','k','k'],
   'B': [5,5,6,7,5,6,-6,7,7,6,-7,7,-8,7,-6,6,-7,50],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2],
   'S': [2012,2013,2014,2015,2016,2012,2012,2014,2015,2016
    ,2012,2013,2012,2013,2014,2015,2016,2014]     
    } );

 df = (df.B + df.C).groupby([df.A,df.S]).agg(['sum','size'])
.unstack(fill_value=0)

df1 = df.groupby(level=0, axis=1).sum()

new_cols= list(zip(df1.columns.get_level_values(0),
['total'] * len(df.columns)))
df1.columns = pd.MultiIndex.from_tuples(new_cols)
df2 = pd.concat([df1,df], axis=1).sort_index(axis=1)

df2.columns = ['_'.join((col[0], str(col[1]))) for col in df2.columns]
df2.columns = df2.columns.str.replace('sum_','')
df2.columns = df2.columns.str.replace('size_','#')

df_without_2012 = df2.sort_index(axis=1).loc[:, '2013':'2016']
df2[((df2['2012'] < 0) | (df_without_2012.sum(axis=1) > 21)) 
& (df_without_2012 > 0).all(axis=1)]

    #2012#2013#2014#2015#2016#total 2012 2013 2014 2015 2016 total
A                                               
d      2    1    1   1    1    6     13   6    7    8    6    40
g      2    1    1   1    1    6    -11   8    8    8    7    20

2问题;

  • df2需要 not 返回'g',因为在最后一行中,和应该超过21,而它不是。什么是不正确的?
  • 第二,我想把这些年和#年份放在一起。

编辑;

代码语言:javascript
运行
复制
-11 8 8 8 7   20   FALSE
 -9 8 8 8 7   22   TRUE
  8 8 8 8 7   39   TRUE
  4 4 4 4 4   20   FALSE

21及所有栏+或2013年:2016 +,2012 -

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-22 20:10:28

解释很容易-- total列是从20122016的和列。

代码语言:javascript
运行
复制
print (-11 +  8  +  8  +  8  +  7)
20

df_without_2012只求和从20132016的列,所以sum是31

代码语言:javascript
运行
复制
print (8  +  8  +  8  +  7)
31

代码语言:javascript
运行
复制
31 > 21
True

第二个问题的答案是添加.sort_index(axis=1, level=1)

代码语言:javascript
运行
复制
df2 = pd.concat([df1,df], axis=1)
        .sort_index(axis=1)
        .sort_index(axis=1, level=1) 

print (df2)
   #2012  2012  #2013  2013  #2014  2014  #2015  2015  #2016  2016  #total  \
A                                                                            
d      2    13      1     6      1     7      1     8      1     6       6   
g      2   -11      1     8      1     8      1     8      1     7       6   

   total  
A         
d     40  
g     20  

编辑:

如果有更多的面具,我认为最好的测试是使用:

代码语言:javascript
运行
复制
df_without_2012 = df2.sort_index(axis=1).loc[:, '2013':'2016']
m1 = df2['2012'] < 0
m2 = df_without_2012.sum(axis=1) > **0**
m3 = (df_without_2012 > 0).all(axis=1)
m4 = df2.total > 21
print (m1)
print (m2)
print (m3)
print (m4)

mask = m1 & m2 **& m4** | m3 & m4
print (mask)

print (df2[mask])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40750673

复制
相关文章

相似问题

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