首页 > 解决方案 > 熊猫:弃用警告:元素比较失败

问题描述

我正在尝试按组将扩展函数应用于熊猫数据帧,但首先过滤掉所有零以及每个组的最后一个值。下面的代码正是我需要的,但有点太慢了:

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

如果有人能帮助我理解为什么会出现这个错误以及如何避免它,我将不胜感激。

标签: pythonpandas

解决方案


我相信你的第一个代码应该改进以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

推荐阅读