【问题标题】:Count frequency of categories in column across subsets of data跨数据子集计算列中类别的频率
【发布时间】:2021-09-22 18:31:36
【问题描述】:

我有一个如下所示的数据集:

         Date Plot  Plant Number Growth Class 2
0  2021-06-14   T2            13              I
1  2021-06-14   C2             6              I
2  2021-06-14   C2             3              S
3  2021-06-14   T1             1              S
4  2021-06-14   C1            18              I
5  2021-06-14   C1            22              S
6  2021-06-14   C3             5              V
7  2021-06-14   C4            15             SS
8  2021-06-14   C1             7              V
9  2021-06-14   C4             1              V
10 2021-06-20   C3            21              S
11 2021-06-20   T2            23              V
12 2021-06-20   C4             5              I
13 2021-06-20   T4            23              V
14 2021-06-28   C4            15             SS
15 2021-06-28   C1            21              V
16 2021-06-28   T4            25              I
17 2021-06-28   T1            17              V
18 2021-07-05   T2            19              V
19 2021-07-05   T4            11              I

我想知道“增长类 2”列中类别的值计数,但在每个日期和情节中,最好使用单个表格。

我尝试以各种方式旋转数据框并使用 value_counts 方法,但没有任何成功。

我可以使用布尔掩码创建数据帧的切片,然后使用 value_counts 方法,但这很费力,我正在寻找一种更好的方法,最好是生成一个包含所有日期和绘图的值表,以便于比较。

# Can do it for each plot and date individually, but there has to be better way.
mask1 = df['Date'] == '2021-06-14'
mask2 = df['Plot'] == 'C2'
df[mask1 & mask2]['Growth Class 2'].value_counts()

Out[126]: 
I     1
S     1
SS    0
V     0
Name: Growth Class 2, dtype: int64

感谢您的阅读。

【问题讨论】:

  • 你可能想看看groupby

标签: python pandas dataframe


【解决方案1】:

相信你在找pd.crosstab

>>> pd.crosstab(index=df["Growth Class 2"], columns=[df.Date, df.Plot])

Date         2021-06-14                2021-06-20          2021-06-28          2021-07-05
Plot                 C1 C2 C3 C4 T1 T2         C3 C4 T2 T4         C1 C4 T1 T4         T2 T4
GrowthClass2
I                     1  1  0  0  0  1          0  1  0  0          0  0  0  1          0  1
S                     1  1  0  0  1  0          1  0  0  0          0  0  0  0          0  0
SS                    0  0  0  1  0  0          0  0  0  0          0  1  0  0          0  0
V                     1  0  1  1  0  0          0  0  1  1          1  0  1  0          1  0

【讨论】:

    【解决方案2】:

    您可以按DatePlot 分组,先使用.groupby(),然后再使用value_counts()

    df.groupby(['Date', 'Plot'])['Growth Class 2'].value_counts()
    

    结果:

    Date        Plot  Growth Class 2
    2021-06-14  C1    I                 1
                      S                 1
                      V                 1
                C2    I                 1
                      S                 1
                C3    V                 1
                C4    SS                1
                      V                 1
                T1    S                 1
                T2    I                 1
    2021-06-20  C3    S                 1
                C4    I                 1
                T2    V                 1
                T4    V                 1
    2021-06-28  C1    V                 1
                C4    SS                1
                T1    V                 1
                T4    I                 1
    2021-07-05  T2    V                 1
                T4    I                 1
    Name: Growth Class 2, dtype: int64
    
    

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多