我想在pandas数据框中创建一列计数。这是输入:
dict = {'id': [1,2,3,4,5,6], 'cat': ['A', 'A', 'A', 'A', 'A', 'B'], 'status': [1, 1, 1, 1, 2, 1]}
id cat status
0 1 A 1
1 2 A 1
2 3 A 1
3 4 A 1
4 5 A 2
5 6 B 1
首选输出:
id cat status status_1_for_cat_count status_2_for_category_count
0 1 A 1 4 1
1 2 A 1 4 1
2 3 A 1 4 1
3 4 A 1 4 1
4 5 A 2 4 1
5 6 B 1 1 0
正如可以预见的那样,我正在尝试将每行添加到两列的完整计数(每个状态一列)。我尝试了几种方法,主要是将groupby与unique_counts结合使用,转换,应用,过滤,合并等等,但却无法使其工作。我可以轻松地在单个列上执行此操作(I want to create a column of value_counts in my pandas dataframe),但不能将两种不同的状态与该类别结合使用。
答案 0 :(得分:4)
您可以先使用get_dummies
,然后使用groupby
转换,即
one = pd.get_dummies(df.set_index(['id','cat']).astype(str))
two = one.groupby(['cat']).transform('sum').reset_index()
id cat status_1 status_2
0 1 A 4 1
1 2 A 4 1
2 3 A 4 1
3 4 A 4 1
4 5 A 4 1
5 6 B 1 0
答案 1 :(得分:4)
另一个选项,使用pd.crosstab
创建一个以cat
为索引的双向表,然后与cat
列上的原始数据框重新联接:
df.join(pd.crosstab(df.cat, 'status_' + df.status.astype(str)), on='cat')
# cat id status status_1 status_2
#0 A 1 1 4 1
#1 A 2 1 4 1
#2 A 3 1 4 1
#3 A 4 1 4 1
#4 A 5 2 4 1
#5 B 6 1 1 0