Skip to main content
 首页 » 编程设计

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

2025年05月04日13artech

我想从 pandas 数据框中获取每个日期的某些技术的点数总和。一个可重现的例子:

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

最终结果可能如下所示(或者在行和列中包含每个日期和技术的计数的名称):

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

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

(pd.DataFrame({'tech': data[['tech']].values.tolist(), 
               'score': data['score'].values, 
               'date': data['date'].values}).groupby(['date','tech']))['score'].sum() 

产生错误:

TypeError: unhashable type: 'list'

所以我认为按列表分组是不可能的。我知道上面给出的想法不会按技术拆分数据,但是,我不知道如何使用 score 列(甚至多个列)来做到这一点。

请您参考如下方法:

我们可以将您的原始数据转换成这种格式

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

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