我正在处理一个大型csv文件,该文件具有看起来像这样的信息
id year decade code type
3366 2014 2010 EM Chemical
3366 2014 2010 EM Chemical
3366 2014 2010 EM Chemical
3366 2014 2010 EM Chemical
3366 2014 2010 EM Chemical
427 1972 1970 DR Coastal Storm
337 1972 1970 DR Coastal Storm
337 1972 1970 DR Coastal Storm
我想按“ id”列中唯一身份出现的次数进行排序。我想要的结果看起来像
id year decade code type count
3366 2014 2010 EM Chemical 5
427 1972 1970 DR Coastal Storm 1
337 1972 1970 DR Coastal Storm 2
但是我试图解决类似问题
id year decade code type count
3366 2014 2010 EM Chemical 5
3366 2014 2010 EM Chemical 5
3366 2014 2010 EM Chemical 5
3366 2014 2010 EM Chemical 5
3366 2014 2010 EM Chemical 5
427 1972 1970 DR Coastal Storm 1
337 1972 1970 DR Coastal Storm 1
337 1972 1970 DR Coastal Storm 2
我尝试通过尝试做到这一点
df['count']=df.groupby('id').transform('count')
但是我总是收到错误消息
ValueError: Wrong number of items passed 18, placement implies 1
是否有更好的方法来实现这一目标?
答案 0 :(得分:2)
format_string = '%Y-%m-%dT%H:%M:%S%z'
d = datetime.strptime('2019-11-05T00:00:00+0000', format_string)
df.groupby(list(df.columns)).size().reset_index().rename(columns={0:'count'})
将使您有所作为,但会创建一个多级索引.size()
将删除包含在名为0的列中的计数的多级索引。.reset_index()
将重命名此列以计数您可以使用转换,但请确保传递与数据帧相同长度的序列。您可以通过将.rename(columns = {0:'count'})
添加到groupby来做到这一点,但是您的任何列都可以:
['year']
答案 1 :(得分:0)
第一个所需的解决方案:
data = data.groupby(['id', 'year', 'decade', 'code', 'type']).id.count()
data
id year decade code type
337 1972 1970 DR Coastal Storm 2
427 1972 1970 DR Coastal Storm 1
3366 2014 2010 EM Chemical 5
Name: id, dtype: int64
第二次:
data['count'] = data.groupby(['id', 'year', 'decade', 'code', 'type']).id.transform('count')
data
id year decade code type count
0 3366 2014 2010 EM Chemical 5
1 3366 2014 2010 EM Chemical 5
2 3366 2014 2010 EM Chemical 5
3 3366 2014 2010 EM Chemical 5
4 3366 2014 2010 EM Chemical 5
5 427 1972 1970 DR Coastal Storm 1
6 337 1972 1970 DR Coastal Storm 2
7 337 1972 1970 DR Coastal Storm 2
数据:
id;year;decade;code;type
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
427;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm
import pandas as pd
data = pd.read_clipboard(sep=';')