在pandas数据框

时间:2018-01-07 04:29:25

标签: pandas pandas-groupby

我想在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),但不能将两种不同的状态与该类别结合使用。

2 个答案:

答案 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