pandas 数据帧上的 for-if 循环语句操作问题

Problem with for-if loop statement operation on pandas dataframe

我有一个数据集,我想创建一个新列,该列基于使用带 if 条件的 for 循环划分的另外两个列。

这是数据集,其中包含预先创建的空 'solo_fare' 列。

任务是遍历每一行,将'Fare'除以'relatives'得到每位乘客的票价。但是,有一定的 if-conditions 可以遵循(此类别的乘客应该看到每位乘客的价格在 3 到 8 之间)

我在这里试过的代码似乎根本没有填写 'solo_fare' 行。它 returns 一个空列(与上面的 df 相同)。

for i in range(0, len(fare_result)):
    p = fare_result.iloc[i]['Fare']/fare_result.iloc[i]['relatives']
    q = fare_result.iloc[i]['Fare']
    r = fare_result.iloc[i]['relatives']
    
    # if relatives == 0, return original Fare amount
    if (r == 0):
        fare_result.iloc[i]['solo_fare'] = q
    # if the divided fare is below 3 or more than 8, return original Fare amount again
    elif (p < 3) or (p > 8):
        fare_result.iloc[i]['solo_fare'] = q
    # else, return the divided fare to get solo_fare
    else:
        fare_result.iloc[i]['solo_fare'] = p 

我怎样才能让它工作?

您是否尝试先初始化那些新列?

我的意思是说 fare_result.iloc[i]['solo_fare'] = q 仅意味着您将值 q 分配给行 i

的字段 solo_fare

问题是此时,第 i 行没有任何 solo_fare 键。因此,您只需在此处填写 table 的最后一个值。

要解决此问题,请尝试在 for 循环之前声明 solo_fare 列,例如:

fare_result['solo_fare'] = np.nan

你可能不应该为此使用循环,而是只使用 loc

如果您先创建 'solo fare' 列并为每一行提供 Fare 的默认值,然后您可以根据设置的条件更改值

fare_result['solo_fare'] = fare_result['Fare']

fare_results.loc[(
    (fare_results.Fare / fare_results.relatives) >= 3) & (
    (fare_results.Fare / fare_results.relatives) <= 8), 'solo_fare'] = (
        fare_results.Fare / fare_results.relatives)

一种方法是定义一个 row-wise 函数,并将其应用于数据框:

# row-wise function (mockup)
def foo(fare, relative):
    # your logic here. Mine just serves as example
    if relative > 100:
        res = fare/relative
    elif (relative < 10):
        res = fare
    else:
        res = 10
    return res

然后将其应用到数据框 (row-wise):

fare_result['solo_fare'] = fare_result.apply(lambda row: foo(row['Fare'], row['relatives']) , axis=1)