【问题标题】:Get the cumulative most frequent status for specific column in pandas dataframe获取熊猫数据框中特定列的累积最频繁状态
【发布时间】:2023-03-28 08:05:01
【问题描述】:

我有一个数据框:

# create example df
df = pd.DataFrame(index=[1,2,3,4,5,6,7,8])
df['ID'] = [1,1,1,1,2,2,2,2]
df['election_date'] = pd.date_range("01/01/2010", periods=8, freq="M")
df['status'] = ['b','a','b','c','a','d','d','b']

# sort values
df.sort_values(['election_date'], inplace=True, ascending=False)
df.reset_index(drop=True, inplace=True)

df 

ID  election_date   status
0   2   2010-08-31    b
1   2   2010-07-31    d
2   2   2010-06-30    d
3   2   2010-05-31    a
4   1   2010-04-30    c
5   1   2010-03-31    b
6   1   2010-02-28    a
7   1   2010-01-31    b

我想为每个ID 获取列status累积 最频繁状态。这是我所期望的:

    ID  election_date   status  cum_most_freq_status
0   2   2010-08-31        b          d
1   2   2010-07-31        d          d
2   2   2010-06-30        d          a
3   2   2010-05-31        a          NaN
4   1   2010-04-30        c          b
5   1   2010-03-31        b          a 
6   1   2010-02-28        a          b
7   1   2010-01-31        b          NaN

解读:

  • 对于2010-01-31,值为NaN,因为过去没有status 值。 2010-05-31 也是如此。
  • 对于2010-03-31,过去最常见的状态是a 和b。因此,我们采用最新的值,即 a

你会怎么做?

【问题讨论】:

    标签: pandas dataframe numpy count cumulative-sum


    【解决方案1】:

    你可以先创建一个DataFrame,以IDelection_date为索引,一次性编码status值,然后计算cumsum

    如果计数相同,我们想选择最近的状态,所以我在 cumsum 中添加一个小数字(小于 1)作为当前状态,所以当我们应用 idxmax 时,它会如果出现平局,请获取最新状态。

    使用idxmax 找到最频繁的累积状态后,我们可以使用原始DataFrame merge

    # make one-hot-encoded status dataframe
    z = (df
             .groupby(['ID', 'election_date', 'status'])
             .size().unstack().fillna(0))
    
    # break ties to choose most recent
    z = z.groupby(level=0).cumsum() + (z * 1e-4)
    
    # shift by 1 row, since we only count previous status occurrences
    z = z.groupby(level=0).shift()
    
    # merge
    df.merge(z.idxmax(axis=1).to_frame('cum_most_freq_status').reset_index())
    

    输出:

       ID election_date status cum_most_freq_status
    0   2    2010-08-31      b                    d
    1   2    2010-07-31      d                    d
    2   2    2010-06-30      d                    a
    3   2    2010-05-31      a                  NaN
    4   1    2010-04-30      c                    b
    5   1    2010-03-31      b                    a
    6   1    2010-02-28      a                    b
    7   1    2010-01-31      b                  NaN
    

    【讨论】:

    • 抱歉,刚刚意识到将您的代码应用到我的数据框后,我丢失了一些行。我的数据框的长度发生了变化。我的列 status 中没有 NaN 值。因此我不知道发生了什么。 Appart 从这个细节来看,一切都很好
    • @PParker 有趣,如果您可以分享一些发生这种情况的样本数据集(只是一个小样本,您至少会丢失一行),我可以检查可能是什么原因
    • 好吧,让我先试着把它分解成更小的部分。我很快就会回来找你!
    • @PParker 实际上,在不查看任何数据的情况下,我怀疑问题可能出在merge 步骤中,因为它试图加入所有重叠列,并且如果重叠列中的某些值是不同的,这将导致行被删除。作为第一步,我会检查我们在to_frame('cum_most_freq_status') 中为每一列使用了不同的名称,并且它不会与df 中的现有列名称重叠
    • 如果这没有帮助,那么是的,让我检查一下你什么时候有一些数据和代码示例发生在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多