【发布时间】: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,这可能会或可能不会起作用,在您的情况下它不起作用,您需要使用新的
loc、iloc或ix访问器来设置数据。 -
另外你正在做的事情可以被矢量化,我想你能发布原始输入数据,你的初始 df 是什么样的,预期的输出是什么,并解释你的代码在做什么
标签: python pandas dataframe calculated-columns