Python 计算列表中项目的频率

Python 计算列表中项目的频率,python,pandas,Python,Pandas,我想计算每个地区每年发生事故的频率。 如何使用Python实现这一点 file.csv Region,Year 1,2003 1,2003 2,2008 2,2007 2,2007 3,2004 1,2004 1,2004 1,2004 我尝试使用计数器,但它只适用于一列。 例子: 在2003年的第1区域,有2个 因此,结果应该是: Region,Year, freq 1,2003,2 1,2003,2 2,2008,1 2,2007,2 2,2007

我想计算每个地区每年发生事故的频率。 如何使用Python实现这一点

file.csv

Region,Year
1,2003
1,2003
2,2008
2,2007
2,2007
3,2004
1,2004
1,2004
1,2004
我尝试使用计数器,但它只适用于一列。 例子: 在2003年的第1区域,有2个 因此,结果应该是:

 Region,Year, freq
    1,2003,2
    1,2003,2
    2,2008,1
    2,2007,2
    2,2007,2
    3,2004,1
    1,2004,3
    1,2004,3
    1,2004,3
我试着这样做。但这似乎不是正确的方法

from collections import Counter

data = pandas.DataFrame("file.csv")
freq_year= Counter(data.year.values)
dz = [dom[x] for x in data.year.values]
data["freq"] = data["year"].apply(lambda x: dom[x])

我正在考虑使用Groupby。你知道怎么做吗?

不是
pandas
解决方案,而是完成工作:

import csv
from collections import Counter

inputs = []
with open('input.csv') as csvfile:
   reader = csv.reader(csvfile)
   for row in reader:
       inputs.append(tuple(row))

freqs = Counter(inputs[1:])
print freqs 
# Counter({('1', '2004'): 3, ('1', '2003'): 2, ('2', '2007'): 2, ('2', '2008'): 1, ('3', '2004'): 1})

这里的关键是将值作为元组,以便
计数器将发现它们相等。

可能有更好的方法,但我首先附加一个伪列,并根据该列计算
频率,如下所示:

df["freq"] = 1
df["freq"] = df.groupby(["Year", "Region"]).transform(lambda x: x.sum())
这将返回以下df:

  Region  Year  freq
0       1  2003     2
1       1  2003     2
2       2  2008     1
3       2  2007     2
4       2  2007     2
5       3  2004     1
6       1  2004     3
7       1  2004     3
8       1  2004     3

我正在尝试绘制此数据集。但我似乎面临着一个问题。你能看看这个问题吗:我对matplotlib了解不多,也没有3D绘图的经验。希望你能在那里得到帮助…你可以简单地选择一个并使用
len
(在最近的
pandas
中):
df.groupby([“年”,“地区])[“年”].transform(len)