繁体   English   中英

遍历行时如何在pandas数据框中添加新列?

[英]How to add a new column to pandas dataframe while iterate over the rows?

我想使用一些已经存在的列来生成新列。但是我认为使用apply函数太困难了。 遍历此数据ftp_price时是否可以生成新列(此处为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)

行可以是视图或副本(通常是副本),因此更改它不会更改原始数据帧。 正确的方法是始终使用lociloc更改原始数据帧:

product_df.loc[index, 'ftp_price'] = ...

话虽如此,您应该尽可能避免显式地迭代数据框的行...

到新的值设定到一个特定的索引的方法是使用at

for index, row in product_df.iterrows():
    product_df.at[index, 'ftp_price'] = val

此外,您还应该阅读为什么应避免使用Iterrows

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM