pandas - 获取熊猫数据框中特定列的累积最频繁状态
问题描述
我有一个数据框:
# 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
我想获得每个列的累积最频繁状态。这是我所期望的:status
ID
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
.
你会怎么做?
解决方案
您可以先创建一个 DataFrame,并使用ID
和election_date
作为其索引,以及 one-hot-encodedstatus
值,然后计算cumsum
.
cumsum
如果计数相同,我们想选择最近的状态,所以我要为当前状态添加一个小数字(小于 1) ,所以当我们应用idxmax
它时,它将选择最近的状态,以防万一一个领带。
在找到最频繁的累积状态后,idxmax
我们可以merge
使用原始 DataFrame:
# 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
推荐阅读
- django - 为什么在发布外键时获取空值(当我在序列化器中使用 slugrelatedfield 将外键作为字符串而不是整数获取时)
- java - ActiveMQ 在服务器闲置几个小时后停止接收消息
- node.js - 显示来自服务器的图像
- c#-4.0 - 我需要一个示例代码或代码来读取和写入注释以及将状态返回到新的 pdf 文档?
- php - 将所有 php 错误和警告存储在全局数组中
- excel - 循环,查找具有值的单元格,然后在列中搜索相同的单元格并更改其值
- javascript - 如何从 pug 的文件中调用 javascript 函数?
- css - 背景图片在手机上不正确
- apache-spark - 是否需要在 Spark 中广播对象成员?
- python - 如何使用不重复的 Pymongo 将文档(MongoDB)插入到集合中