gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:15:15 24 4
gpt4 key购买 nike

我想从 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

关于python - 每个日期的点数总和按列表形式的附加列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com