python - 熊猫:弃用警告:元素比较失败
问题描述
我正在尝试按组将扩展函数应用于熊猫数据帧,但首先过滤掉所有零以及每个组的最后一个值。下面的代码正是我需要的,但有点太慢了:
df.update(df.loc[~df.index.isin(df.groupby('group')['value'].tail(1).index)&
(df['value']!= 0)].iloc[::-1].groupby('group')[
'value'].expanding().min().reset_index(level=0, drop=True))
我使用以下代码找到了一种更快的方法:
df.update(df.iloc[::-1].groupby('group')[
'value'].expanding().min().reset_index(level=0, drop=True),
filter_func = lambda x: (x!=0)&(x[-1]==False))
但是,对于我目前正在处理的数据集,我收到一个警告(“C:...\anaconda3\lib\site-packages\ipykernel_launcher.py:22: DeprecationWarning: elementwise comparison failed;这将在未来。”)。
奇怪的是,使用这样的小型虚拟数据集我没有收到错误:
data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B',
'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'value':[3, 0, 8, 7, 0, -1, 0, 9, -2, 0, 0, 2, 0, 5, 0, 1]}
df = pd.DataFrame(data)
df
group value
0 A 3
1 A 0
2 A 8
3 A 7
4 A 0
5 B -1
6 B 0
7 B 9
8 B -2
9 B 0
10 B 0
11 C 2
12 C 0
13 C 5
14 C 0
15 C 1
如果有人能帮助我理解为什么会出现这个错误以及如何避免它,我将不胜感激。
解决方案
我相信你的第一个代码应该改进以DataFrame.duplicated
获得更好的性能,第二个代码对我不起作用:
m = df.duplicated('group', keep='last') & (df['value']!= 0)
s = df[m].iloc[::-1].groupby('group')['value'].expanding().min().reset_index(level=0,drop=True)
df.update(s)
#alternative, not sure if faster
#df['value'] = s.reindex(df.index, fill_value=0)
print (df)
group value
0 A 3.0
1 A 0.0
2 A 7.0
3 A 7.0
4 A 0.0
5 B -2.0
6 B 0.0
7 B -2.0
8 B -2.0
9 B 0.0
10 B 0.0
11 C 2.0
12 C 0.0
13 C 5.0
14 C 0.0
15 C 1.0
推荐阅读
- ios14 - 是否可以在没有完整应用程序的情况下构建 App Clip?
- r - 将时间序列分组为分层数据
- symfony5 - 在新用户的表单中使用密码编码器
- r - 在用户定义函数中调用 colnames()
- mysql - 如何只选择一个值的前 2 个寄存器?
- javascript - 如何解决这种意外混合的“>>>”和“&”运算符警告?
- c# - 列表
- > 达到内存限制
- cypress - 赛普拉斯:赛普拉斯无法找到边缘
- python - 在本地运行 Pyspark 以访问 S3 中的 parquet 文件错误:“无法从链中的任何提供商加载 AWS 凭证”
- powershell - 如何使用 powershell 自定义日期获得与某个日期的年月差?