首页 > 解决方案 > 循环、if 语句和 append() 的数据框

问题描述

我有一套非常特殊的逻辑,我试图在 Python 中实现,这显然超出了我目前的理解。

我将逐步介绍这个概念,然后在下面发布代码尝试:

  1. 确定两个单独列中的值是否符合条件(>= 和 <= 0.5) - 如果为真,则 .append() 将第三列的值(在通过测试的完全相同的日期时间索引处)到单独的时间序列目的。
  2. ELIF:确定前两列中的值是否符合条件(<= 和 >= 0.5) - 如果为真,则 .append() 第四列的值(在通过测试的完全相同的日期时间索引处)到单独的时间序列对象(与第一个测试相同)。
  3. 最后一个对象是一个单独的时间序列对象,它按每个测试通过时的时间顺序保存第 3 列和第 4 列的值。

以下是我迄今为止尝试过的代码:

# create empty time series
port_switching = pd.Series([])

# attempt to define a function to switch returns
def switch(var1, var2, var3, var4):
    if var1 >= 0.5 and var2 =< 0.5:
        port_swtiching.append(cap_ret.last('D'))
    elif var1 <= 0.5 and var1 >= 0.5:
        port_switching.append(ew_ret.last('D')).

switch(df["var1", "var2", "var3", "var4"]
print(port_swtiching)

现在,我很清楚这段代码的错误。此时我已经收到 Python 中可用的所有错误。我只是不确定如何修复错误。任何人都可以提供有关如何前进的想法吗?我想创建一个for loop因此迭代更大的数据集。此外,我不一定需要一个函数——无论逻辑如何。

标签: pythonpandasdataframe

解决方案


我认为您正在寻找的部分是for对所有行进行循环并根据行进行一些计算,因此我不会介绍您的所有详细过程,而只是展示基本用法。

请看一下apply()(文档)

apply()功能可以让您沿着任何轴循环。

您可以轻松地在函数中写下您的逻辑(switch()如下例所示)。

在此函数中,您可以通过点运算符访问列值。(如row.var1)。

这是一个最小的例子。

import pandas as pd
d = {'var1': [0.7, 0.5], 
     'var2': [0.6, 0.3],
     'var3': [3, 4],
     'var4': [3, 4]}
df = pd.DataFrame(data=d)

def switch(row):
    if row.var1 >= 0.5 and row.var2 <= 0.5:
        return 'foo'
    elif row.var1 <= 0.5 and row.var1 >= 0.5:
        return 'bar'
    else:
        return 'baz'
    
port_switching = df.apply(switch, axis=1)

推荐阅读