首页 > 解决方案 > 当范围太大时,会产生错误:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

问题描述

下面的代码最多可用于 8000 行。不仅如此,它还会产生错误:Series 的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

df 按“ID”排序。我需要用“ID”枚举填充“ENTRADA”列。

身份证... ENTRADA

150 ... 1

150 ... 2

150 ... 3

151 ... 1

152 ... 1

152 ... 2

有没有更简单的方法来做到这一点?

def preencheEntrada():
    id_documento = 0
    numEntrada = 0
    for i in range(len(df)) : 
        valor_id_documento = df.loc[i, 'ID']
        if (id_documento == valor_id_documento) :
            numEntrada = numEntrada + 1
        else :
            id_documento = valor_id_documento
            numEntrada = 1
        df.loc[i, 'ENTRADA'] = numEntrada

标签: pythonpandas

解决方案


您不应该这样使用pandas,而是始终尝试选择矢量化操作。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({"ID": [150, 150, 150, 151, 152, 152]})

In [3]: df
Out[3]:
    ID
0  150
1  150
2  150
3  151
4  152
5  152

In [4]: df.groupby('ID').cumcount()
Out[4]:
0    0
1    1
2    2
3    0
4    0
5    1
dtype: int64

因此,如果您必须从 开始1,您可以执行以下操作:

In [5]: df["ENTRADA"] = df.groupby("ID").cumcount() + 1

In [6]: df
Out[6]:
    ID  ENTRADA
0  150        1
1  150        2
2  150        3
3  151        1
4  152        1
5  152        2

无论如何,你得到的错误没有多大意义,它不应该取决于你的数据帧的长度,没有可重复的例子,我们只能推测。


推荐阅读