首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以列表形式按附加列分组的每个日期点数之和

以列表形式按附加列分组的每个日期点数之和
EN

Stack Overflow用户
提问于 2018-03-23 17:54:32
回答 2查看 83关注 0票数 1

我想从熊猫的数据框架中获得一些技术的总和。可复制的例子:

代码语言:javascript
复制
data = pd.DataFrame(
        {'date': ['2017-01-31', '2017-02-28', '2017-02-28'],
        'tech': [['c++', 'python'], ['c++', 'c', 'java'], ['java']],
        'score': [1, 4, 2]}
        )

最终结果可能是这样的(或者有一行的名称和一个列,每个日期和技术都有计数):

代码语言:javascript
复制
date        c++     python  c   java
2017-01-31  1       1       4   0
2017-02-28  4       0       4   6

点数(列score)应按日期和技术相加。按日期和技术分组的解决方案是不可能的,因为每一行都可以包含多种编程语言/框架。我编写了以下代码:

代码语言:javascript
复制
(pd.DataFrame({'tech': data[['tech']].values.tolist(),
               'score': data['score'].values,
               'date': data['date'].values}).groupby(['date','tech']))['score'].sum()

它会产生一个错误:

TypeError:无法理解的类型:“列表”

因此,我认为不可能按列表分组。我知道,上面给出的想法并不是按技术来分割数据,但是,我不知道如何使用列score (甚至多列)来实现这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-23 17:59:21

我们可以将原始数据转换为这种格式。

代码语言:javascript
复制
s=data.tech.str.len()
newdf=pd.DataFrame({'date':data.date.repeat(s),'score':data.score.repeat(s),'tech':np.concatenate(data.tech.values)})
newdf
Out[477]: 
         date  score    tech
0  2017-01-31      1     c++
0  2017-01-31      1  python
1  2017-02-28      4     c++
1  2017-02-28      4       c
1  2017-02-28      4    java
2  2017-02-28      2    java

然后,我们使用pivot_table

代码语言:javascript
复制
pd.pivot_table(newdf,index='date',columns='tech',values='score',aggfunc='sum',fill_value=0)
Out[476]: 
tech        c  c++  java  python
date                            
2017-01-31  0    1     0       1
2017-02-28  4    4     6       0
票数 4
EN

Stack Overflow用户

发布于 2018-03-23 18:07:01

get_dummiessum的魔法。

代码语言:javascript
复制
(data.tech
     .str.join(' ')
     .str.get_dummies(sep=' ')
     .mul(data.score.values, axis=0)
     .set_index(data.date)
     .sum(level=0)
)

            c  c++  java  python
date                            
2017-01-31  0    1     0       1
2017-02-28  4    4     6       0

只需确保语言名称本身不包含空格,否则需要将sep=' '从空格更改为其他(在任何语言名称中都找不到)。

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

https://stackoverflow.com/questions/49455722

复制
相关文章

相似问题

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