我想使用已经存在的一些列来生成新列。但是我认为使用apply
函数太困难了。遍历此数据框时是否可以生成新列(此处为ftp_price
)?这是我的代码。当我致电product_df['ftp_price']
时,出现了KeyError。
for index, row in product_df.iterrows():
current_curve_type_df = curve_df[curve_df['curve_surrogate_key'] == row['curve_surrogate_key_x']]
min_tmp_df = row['start_date'] - current_curve_type_df['datab_map'].apply(parse)
min_tmp_df = min_tmp_df[min_tmp_df > timedelta(days=0)]
curve = current_curve_type_df.loc[min_tmp_df.idxmin()]
tmp_diff = row['end_time'] - np.array(row['start_time'])
if np.isin(0, tmp_diff):
idx = np.where(tmp_diff == 0)
col_name = COL_NAMES[idx[0][0]]
row['ftp_price'] = curve[col_name]
else:
idx = np.argmin(tmp_diff > 0)
p_plus_one_rate = curve[COL_NAMES[idx]]
p_minus_one_rate = curve[COL_NAMES[idx - 1]]
d_plus_one_days = row['start_date'] + rate_mapping_dict[COL_NAMES[idx]]
d_minus_one_days = row['start_date'] + rate_mapping_dict[COL_NAMES[idx - 1]]
row['ftp_price'] = p_minus_one_rate + (p_plus_one_rate - p_minus_one_rate) * (row['start_date'] - d_minus_one_days) / (d_plus_one_days - d_minus_one_days)
答案 0 :(得分:1)
行可以是视图或副本(通常是副本),因此更改它不会更改原始数据帧。正确的方法是始终使用loc
或iloc
更改原始数据帧:
product_df.loc[index, 'ftp_price'] = ...
话虽如此,您应该避免在可能的情况下显式地迭代数据框的行...
答案 1 :(得分:1)
将新值设置为特定索引的另一种方法是使用at
:
for index, row in product_df.iterrows():
product_df.at[index, 'ftp_price'] = val