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)
我有一个数据集,我想创建一个新列,该列基于使用带 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)