输出数据框pandas的大小

ndh0cuux  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(125)

我实现了两个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的新列的每个循环的结果.

nhaq1z21

nhaq1z211#

你的问题是在这里c.iloc[idx,0] = s2.iloc[idx, col]你试图分配一个值给一个不存在于DataFrame中的索引。
一种解决方案是使用loc方法为循环的每次迭代向r和c DataFrames添加一个新行。
下面是你的更新代码,它应该可以工作:

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.loc[idx,:] = 0
        elif row > s1.iloc[idx, col]:
            diff = row - s1.iloc[idx, col]
            s2.iloc[idx,col] = diff
            r.loc[idx, 'R'] = diff
            c.loc[idx, 'C' + str(col)] = s2.iloc[idx, col]
        else:
            r.loc[idx, 'R'] = row

result = pd.concat([s2, r, c], axis=1)

相关问题