我想从熊猫的数据框架中获得一些技术的总和。可复制的例子:
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:无法理解的类型:“列表”
因此,我认为不可能按列表分组。我知道,上面给出的想法并不是按技术来分割数据,但是,我不知道如何使用列score (甚至多列)来实现这一点。
发布于 2018-03-23 17:59:21
我们可以将原始数据转换为这种格式。
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发布于 2018-03-23 18:07:01
get_dummies和sum的魔法。
(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=' '从空格更改为其他(在任何语言名称中都找不到)。
https://stackoverflow.com/questions/49455722
复制相似问题