我实现了两个input dataframes pandas:
mu, sigma = 4., 1.3
s1 = pd.DataFrame(np.random.lognormal(mu, sigma, size=(1000, 1000)))
min_value = s1.values.min()
max_value = s1.values.max()
s2 = pd.DataFrame(np.random.uniform(min_value, max_value, size=(1000, 1)))
其中s2只有一列,s1有1000列和1000个元素。我创建了一个循环,其中来自s2的每个元素按照索引顺序从s1 Dataframe 的每个元素中减去。结果按照一些条件记录在两个输出 Dataframe 中。每次循环后,更新后的 Dataframe S2应该通过尝试从S1 Dataframe 中减去另一列而进入新的循环。
”
r = pd.DataFrame(columns=['R'])
c = pd.DataFrame(columns=['C'])
for col in s1.columns:
for idx, row in enumerate(s2.values):
if (row >= 0.95*s1.iloc[idx, col]) and (row <= 1.05*s1.iloc[idx, col]):
s2.iloc[idx,col] = 0
r.iloc[idx,:] = 0
elif row > s1.iloc[idx, col]:
diff = row - s1.iloc[idx, col]
s2.iloc[idx,col] = diff
r.iloc[idx,0] = diff
c.iloc[idx,0] = s2.iloc[idx, col]
else:
r.iloc[idx,0] = row
result = pd.concat([s2, r, c], axis=1)
”
当我运行这个脚本时,我得到错误:索引错误:iloc无法扩大其目标对象我想更新dataframe c和r在一个单独的列避免覆盖.有人能帮助我吗?或者,它是可以接受的记录在c和r dataframe的新列的每个循环的结果.
1条答案
按热度按时间nhaq1z211#
你的问题是在这里
c.iloc[idx,0] = s2.iloc[idx, col]
你试图分配一个值给一个不存在于DataFrame中的索引。一种解决方案是使用
loc
方法为循环的每次迭代向r和c DataFrames添加一个新行。下面是你的更新代码,它应该可以工作: