python - Pandas:根据列中的当前值设置先前的值(按组)
问题描述
我有一个熊猫数据框,其中的值应该大于或等于前面的值。在当前值低于前值的情况下,前值必须设置为等于当前值。这最好通过下面的例子来解释:
data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B',
'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'value':[0, 1, 2, 3, 2, 0, 1, 2, 3, 1, 5, 0, 1, 0, 3, 2]}
df = pd.DataFrame(data)
df
group value
0 A 0
1 A 1
2 A 2
3 A 3
4 A 2
5 B 0
6 B 1
7 B 2
8 B 3
9 B 1
10 B 5
11 C 0
12 C 1
13 C 0
14 C 3
15 C 2
我正在寻找的结果是:
group value
0 A 0
1 A 1
2 A 2
3 A 2
4 A 2
5 B 0
6 B 1
7 B 1
8 B 1
9 B 1
10 B 5
11 C 0
12 C 0
13 C 0
14 C 2
15 C 2
解决方案
所以这就是我的出发点!(特别感谢@jezrael 帮助我大大简化了它!)
我以此为基础Expanding Windows
,反过来,总是得到每个组中元素的后缀(从最后一个元素开始,向第一个元素扩展)。
这个扩展窗口具有以下逻辑:对于 index 中的元素i
,您会得到一个Series
包含所有带有 indices 的组中的元素>=i
,我需要i
在结果中返回一个新的单个值。
这个后缀对应的值是多少?它的最低限度!因为如果后面的元素更小,我们需要取其中最小的。
然后我们可以将此操作的结果分配给df['value']
.
试试这个:
df['value'] = (df.iloc[::-1]
.groupby('group')['value']
.expanding()
.min()
.reset_index(level=0, drop=True)
.astype(int))
print (df)
输出:
group value
0 A 0
1 A 1
2 A 2
3 A 2
4 A 2
5 B 0
6 B 1
7 B 1
8 B 1
9 B 1
10 B 5
11 C 0
12 C 0
13 C 0
14 C 2
15 C 2
推荐阅读
- php - 如何访问 iframe 中的网站并搜索内容
- r - 如何散点图时间序列?
- python - dtype 对象无法转换为浮点 matplotlib
- excel - 通过查找标题“电子邮件”并将电子邮件发送到匹配标题下方的第一个单元格,Excel VBA 发送到电子邮件地址
- multithreading - spring batch 多线程阅读器处理器编写器
- python - JSON 请求将数据返回到浏览器但不返回刮板
- java - 如何在spring boot中从实体自动生成表到shema
- java - 使用 jdbc 时如何使用时区保存正确的日期时间
- python - Plotly Dash 饼图 - 分割文本颜色和小数位
- flutter - 如何在 Android Studio 中格式化 Flutter 代码的特定部分