【问题标题】:DataFrame change doesn't save when iterating迭代时 DataFrame 更改不保存
【发布时间】:2015-03-23 15:59:20
【问题描述】:

我正在尝试从文件中读取某个 DF,并在其中添加另外两列,例如来自 DF 中其他列的年份和星期。当我应用代码生成一个新列时,一切都很好。但是当要创建的列很少时,更改不适用。具体来说,会创建新列,但它们的值不是应有的值。

我知道会发生这种情况,因为我首先将所有新值设置为某个初始字符串,然后更改其中一些,但我不明白为什么它适用于单个列并且对多个列“无效”,离开只更改了最新的专栏...请帮忙?

tbl =  pd.read_csv(file).fillna('No Fill')
date_cols = ['Col1','Col2']
for i in range(len(date_cols)):
    tmp_col_name = date_cols[i] + '_WEEK'
    tbl[tmp_col_name] = 'No Week'   
    bad_ind = list(np.where(tbl[date_cols[i]] == 'No Fill')[0])        
    tbl_ind = range(len(tbl))
    for i in range(len(bad_ind)): 
        tbl_ind.remove(bad_ind[i])
    tmp = pd.to_datetime(tbl[date_cols[i]][tbl_ind])        
    tbl[tmp_col_name][tbl_ind] = tmp.apply(lambda x: str(x.isocalendar()[0]) + '+' + str(x.isocalendar()[1]))

如果我尝试以下几行,忽略可能的“空数据值”,一切正常......

tbl =  pd.read_csv(file).fillna('No Fill')
date_cols = ['Col1','Col2']
for i in range(len(date_cols)):
    tmp_col_name = date_cols[i] + '_WEEK'
    tbl[tmp_col_name] = 'No Week'   
    tmp = pd.to_datetime(tbl[date_cols[i]])        
    tbl[tmp_col_name] = tmp.apply(lambda x: str(x.isocalendar()[0]) + '+' + str(x.isocalendar()[1]))

这与不更改所有数据值有关,但我不明白为什么更改不适用 - 毕竟,在第二次迭代开始之前,DF 似乎已更新,然后tbl[tmp_col_name] = 'No Week' 第二次迭代“删除”在第一次迭代中所做的更改,但只是部分地 - 它保留了新列的创建但填充了“无周”值...

【问题讨论】:

  • 您正在执行chained indexing,这可能会或可能不会起作用,在您的情况下它不起作用,您需要使用新的locilocix 访问器来设置数据。
  • 另外你正在做的事情可以被矢量化,我想你能发布原始输入数据,你的初始 df 是什么样的,预期的输出是什么,并解释你的代码在做什么

标签: python pandas dataframe calculated-columns


【解决方案1】:

非常感谢@EdChum!执行链式索引可能有效,也可能无效。如果创建新的多列然后只填写它们的一些值,它就不起作用。更准确地说,它确实有效,但仅在最后更新的列上有效。使用 loc、iloc 或 ix 访问器来设置数据工作。在上述代码的情况下,要使其工作,需要将 tbl_ind 转换为 np.array,使用 tbl[col_name[j]].iloc[np.array(tbl_ind)] = tmp.apply(lambda x: x.year) 非常感谢并感谢 @EdChum 的回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多