Python Pandas迭代行并计算一对唯一列显示的次数

时间:2017-03-29 19:26:23

标签: python pandas

我正在尝试添加一列来计算电台日期(否)显示的次数。

例如,日期6/12/2013在No1中仅显示1条记录,因此计为1.在2013年5月11日的第3期有3条记录。第一次出现应计为1,第二次出现发生次数计为2,依此类推,第三次发生次数计为3次。

输入:

    No   Date        Value    
0   1    6/12/2013   35 
1   1    6/13/2013   45
2   1    6/14/2013   23
3   1    6/14/2013   40
4   2    6/12/2013   15
5   2    6/13/2013   20
6   2    6/14/2013   24
7   2    7/23/2013   33
8   3    5/11/2013   10
9   3    5/11/2013   11
10  3    5/11/2013   34
11  3    5/18/2013   24
.
.
.

结果应如下所示:

    No   Date        Value    count
0   1    6/12/2013   35       1
1   1    6/13/2013   45       1
2   1    6/14/2013   23       1
3   1    6/14/2013   40       2
4   2    6/12/2013   15       1
5   2    6/13/2013   20       1
6   2    6/14/2013   24       1
7   2    7/23/2013   33       1
8   3    5/11/2013   10       1
9   3    5/11/2013   11       2
10  3    5/11/2013   34       3
11  3    5/18/2013   24       1
.
.
.

我自己的解决方案是

result = []
for n in df['No'].unique():
    df1 = df[df['No'] == n]
    for date in df1['Date'].unique():
        df2 = df1[df1['Date'] == date]
        df2['count'] = np.arange(len(df2)) + 1
        result.append(df2)

并将结果合并在一起。但它运行得很慢。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

执行groupby并使用cumcount

df['count'] = df.groupby(['No', 'Date']).cumcount() + 1

cumcount开始,从0开始,必要时添加1。

结果输出:

    No       Date  Value  count
0    1  6/12/2013     35      1
1    1  6/13/2013     45      1
2    1  6/14/2013     23      1
3    1  6/14/2013     40      2
4    2  6/12/2013     15      1
5    2  6/13/2013     20      1
6    2  6/14/2013     24      1
7    2  7/23/2013     33      1
8    3  5/11/2013     10      1
9    3  5/11/2013     11      2
10   3  5/11/2013     34      3
11   3  5/18/2013     24      1