【问题标题】:How to get event wise frequency and the frequency of each event in a dataframe?如何获得事件频率和数据框中每个事件的频率?
【发布时间】:2022-11-04 14:47:16
【问题描述】:

我有一个像这样的数据集:

Data
 a
 a
 a
 a
 a
 b
 b
 b
 a  
 a
 b

我想添加一列,如下所示。数据将在列中采用 a1,1 的形式,其中第一个元素表示事件频率 (a1),第二个元素 (,1) 是每个事件的频率。有没有办法我们可以使用 python 做到这一点?

   Data   Frequency
     a        a1,1
     a        a1,2    
     a        a1,3
     a        a1,4
     a        a1,5
     b        b1,1
     b        b1,2
     b        b1,3
     a        a2,1
     a        a2,2
     b        b2,1

【问题讨论】:

  • Pandas 旨在将信息存储在多列中,因此我将为您的事件标签(例如a1b1a2...)和每个事件中的行顺序(例如1,2,3,4,5,1,2,3,1...)

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以使用:

# identify changes in Data
m = df['Data'].ne(df['Data'].shift()).cumsum()
# cumulated increments within groups
g1 = df.groupby(m).cumcount().add(1).astype(str)

# increments of different subgroups per Data
g2 = (df.loc[~m.duplicated(), 'Data']
        .groupby(df['Data']).cumcount().add(1)
        .reindex(df.index, method='ffill')
        .astype(str)
      )

df['Frequency'] = df['Data'].add(g2+','+g1)

输出:

   Data Frequency
0     a      a1,1
1     a      a1,2
2     a      a1,3
3     a      a1,4
4     a      a1,5
5     b      b1,1
6     b      b1,2
7     b      b1,3
8     a      a2,1
9     a      a2,2
10    b      b2,1

【讨论】:

    【解决方案2】:

    代码:

    from itertools import groupby
    
    
    k = [key for key, _group in groupby(df['Data'].tolist())]  #OUTPUT ['a', 'b', 'a', 'b']
    
    Key = [v+f'{k[:i].count(v)+1}' for i,v in enumerate(k)]  #OUTPUT ['a1', 'b1', 'a2', 'b2']
    
    Sum = [sum(1 for _ in _group) for key, _group in  groupby(df['Data'].tolist())] #OUTPUT [4, 3, 2, 1]
    
    df['Frequency']  = [f'{K},{S}' for I, K in enumerate(Key)  for S in range(1, Sum[I]+1)]   
    

    输出:

        Data    Frequency
    0   a       a1,1
    1   a       a1,2
    2   a       a1,3
    3   a       a1,4
    4   b       b1,1
    5   b       b1,2
    6   b       b1,3
    7   a       a2,1
    8   a       a2,2
    9   b       b2,1
    

    【讨论】:

      【解决方案3】:
      def function1(dd:pd.DataFrame):
          dd2=dd.assign(col2=dd.col1.ne(dd.col1.shift()).cumsum())
              .assign(col2=lambda dd:dd.Data+dd.col2.astype(str))
              .assign(rk=dd.groupby('col1').col1.transform('cumcount').astype(int)+1)
              .assign(col3=lambda dd:dd.col2+','+dd.rk.astype(str))
          return dd2.loc[:,['Data','col3']]
      
      df1.assign(col1=df1.ne(df1.shift()).cumsum()).groupby(['Data']).apply(function1)
      
      
        Data  col3
      0     a  a1,1
      1     a  a1,2
      2     a  a1,3
      3     a  a1,4
      4     a  a1,5
      5     b  b1,1
      6     b  b1,2
      7     b  b1,3
      8     a  a2,1
      9     a  a2,2
      10    b  b2,1
      

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 2016-11-04
        相关资源
        最近更新 更多