Python Pandas 数据帧移位在应用函数中不起作用

标签 python pandas dataframe apply

我在下面收到此错误

AttributeError:(“'float'对象没有属性'shift'”,'发生在索引718170')

运行下面的 pandas 脚本。

def volumediff(x):
    if x['positive_mvt'] == True:
        volume_d = x['volume'].shift(1)
    else:
        volume_d = ""
    return volume_d

df['new_volume'] = df.apply(volumediff,axis=1)

因此,我相信基于 AttributeError: 'float' object has no attribute 'split' 处几乎类似的错误,我以为问题是 由空值引起,因为移位函数采用的值可能不在我的数据集中。但是,我成功地完成了以下操作,没有任何问题。

df['new_volume'] = df['volume'].shift(1)

不幸的是,它不适用于我需要的 apply 函数,因为我需要使用“if else”。

我尝试使用下面的脚本来解决问题 - 通过使用 try except 来跳过任何产生值问题的单元格。但我的列中的所有值都收到“NA”和“”,但事实不应该如此。

def volumediff(x):
    if x['positive_mvt'] == True:
        try:
            volume_d = x['volume'].shift(1)
        except:
            volume_d = "NA"
    else:
        volume_d = ""
    return volume_d

df['new_volume'] = df.apply(volumediff,axis=1)

原始样本 df:

x = [
    [False, 240.20353],
    [False, 621.28854],
    [True, 64.85972],
    [True, 151.86484],
    [False, 190.91042],
    [True, 128.78566],
    [False, 415.53138],
    [True, 43.14669],
    [True, 512.03531],
    [True, 502.41939],
]

df = pd.DataFrame(x, columns=['positive_mvt', 'volume'])

df
Out[1]: 
   positive_mvt     volume
0         False  240.20353
1         False  621.28854
2          True   64.85972
3          True  151.86484
4         False  190.91042
5          True  128.78566
6         False  415.53138
7          True   43.14669
8          True  512.03531
9          True  502.41939

错误示例:

cmdline dataframe print

我检查了我的数据框,我怀疑这个问题可能是由我的 if 函数之间的冲突引起的,该函数只选择正确的行,但是 x[volume].shift( 需要一些错误的行1) 这是它上面的行。但事实并非如此,因为当我尝试下面的脚本时,它也不起作用并触发相同的属性错误。看起来使用 apply 函数不适用于 .shift。

def volumediff(x):
    volume_d = x['volume'].shift(1)
    return volume_d

df['new_volume'] = df.apply(volumediff,axis=1)

有人对如何解决这个问题有任何见解,而不需要做两个单独的列并依次分别处理 if else 和负移位公式吗?

最佳答案

当您运行apply时,它将每个列/行(在您的案例行中)传递给您正在应用的函数。如果您对一个系列调用 .shift() ,这是有意义的 - 您正在移动该系列。正如您所做的那样,对系列中的单个值调用 shift 是没有意义的(您如何移位 12?这意味着什么?)。

您想要做的是:

df['new_volume'] = df['volume'].shift(1)
df.loc[df['positive_mvt'] == False, 'new_volume'] = ""

此外,我不知道您的数据类型是什么,您可能应该小心。

关于Python Pandas 数据帧移位在应用函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57207005/

相关文章:

python - "RuntimeError: Expected 4-dimensional input for 4-dimensional weight 32 3 3, but got 3-dimensional input of size [3, 224, 224] instead"?

python - 使用 python/pandas 将任意多列转换为键值对

python - 将 pandas 数据框中的列值乘以列标题

python - 将两列 Pandas 数据框转换为以第一列为键的列表字典

python - 我无法在 python shell 中调用 pymongo

python - 隔离重复列值

python - Pandas :功能和应用于系列之间的时间差异

r - 将月份第一级的值保留在数据框中,同时将 R 中的其余值设置为零

python - pandas - 通过添加另一个级别来扩展 DataFrame

python - "unsupported operand type(s) for -: ' int' 和 'tuple' "是什么意思?