我有几个数据框,每个都有几千行,看起来与此类似:
heifers_df
id y ins
200316157 123 2004121
200316157 456 2004121
200316157 789 2004121
200519776 456 2007234
200519776 789 2007234
200812334 123 2010333
200812334 789 2010333
200812334 345 2010333
200812334 567 2010333
我想用python(pandas or numphy?)来统计每个ID的出现次数,总出现次数(T)和每次出现次数(No) :
heifers_df
id y ins T No
200316157 123 2004121 3 1
200316157 456 2004121 3 2
200316157 789 2004121 3 3
200519776 456 2007234 2 1
200519776 789 2007234 2 2
200812334 123 2010333 4 1
200812334 789 2010333 4 2
200812334 345 2010333 4 3
200812334 567 2010333 4 4
我在 Fortran Counting frequency of variables in text data in Fortran 中得到了有关此问题的帮助 但现在我正在尝试在 python 中实现相同的功能。
基于 Fortran 代码和我对 Python 和 Pandas 的初学者知识,这是我尝试使用第一个数据框所做的:
i1 = 0
# set i0, i1
# i0: line where specific user id starts
# i1: line where specific user id ends
for i in range(len(heifers_df)) :
i0 = i1 + 1
same_id = True
while same_id == True :
heifers_df.loc[
heifers_df["id"[i]] != heifers_df["id"[i0]], #How do I reference each row within the column?
same_id ] = False
i1 = i
heifers_df["T"] = i1-i0+1
heifers_df["No"] = i-i0+1
但是当我运行这个时,我得到一个错误:
.... heifers_df["id"[i]] != heifers_df["id"[i0]],
KeyError: 'i'
我这样做是不是走错方向了?
我曾尝试搜索类似的问题,我见过分组和计数操作,但我还没有看到将结果粘贴到问题中的 ID 并对每个 ID 进行计数的操作。 任何帮助将不胜感激。
答案 0 :(得分:2)
IIUC,如果所有唯一 id 都可以排序到连续的块中。
df['T'] = df.groupby('id')['id'].transform('count')
df['No'] = df.groupby('id')['id'].cumcount() + 1
df
输出:
id y ins T No
0 200316157 123 2004121 3 1
1 200316157 456 2004121 3 2
2 200316157 789 2004121 3 3
3 200519776 456 2007234 2 1
4 200519776 789 2007234 2 2
5 200812334 123 2010333 4 1
6 200812334 789 2010333 4 2
7 200812334 345 2010333 4 3
8 200812334 567 2010333 4 4