【问题标题】:How to rearrange and append data contained in a column of a df in the rows of another dataframe如何在另一个数据框的行中重新排列和附加包含在df列中的数据
【发布时间】:2021-10-01 14:08:53
【问题描述】:

我在将数据从数据框移动到新的空框时遇到很大困难。

这些是我的 dfs

df1:

df2:

我想重新排列 df2['Close','Close 2','Close 3',...,'Close n'] 中的 df1['Close'] 的值,将它们放在一行中,比如说 20在 df2 的一行中“关闭”df1 的值(df1 20 第一行),然后继续 df2 的第二行放置接下来的 20 行 df1(从 21 到 40)。这将在忽略两个 dfs 的目标列时发生,因此我尝试以这些参数为例。 我试图更好地解释.. 5(在 for 循环的范围内)是我想在 df2 中处理 df1['Close'] 的前 100 个值的行数:

for j in range (0, 5):

    count = 20;
    amazon_df_copy = 
amazon_df_copy.iloc[j:j+1,1:len(amazon_df_copy.columns)].append(normalized_amazon_df.iloc[:count,1:2]);
    count += 20;

结果是这样的:

我什至尝试了不同的方式,但我只能填充一列,结果我的列的顺序发生了变化,甚至有些列丢失了。完成后,我将删除 NaN 剩余值,而目标将填充对应于 20 个输入的值(关闭列,但现在不重要)。

我希望我想要实现的目标是可以理解的,希望您能提供帮助。 :(

【问题讨论】:

  • @ShivamRoy 非常感谢!我想以这种方式将目标值从 df1 插入到 df2: df1['Target][1] --> df2['Target'][1] df1['Target][21] --> df2['Target' ][2] df1['Target][41] --> df2['Target'][3] 等等..
  • 嗨@Alexander Gechev,我希望您对我的回答发表评论,因为当您对自己的问题发表评论时,我没有收到任何通知。关于Target 的值,我真的很抱歉,但我不确定我是否仍然理解它。您想以与Close 行类似的方式拥有Target 行吗?还是您只想要第 1、第 21、第 41 等值?
  • 我想我已经理解了你的要求,我已经编辑了我的答案。请让我知道它是否适合您以及我的假设是否正确。

标签: python dataframe jupyter-notebook


【解决方案1】:

您可以通过使用reshape 对每 20 列进行转置来实现此目的:

new_df = pd.DataFrame(df1.Close.values.reshape(-1, 20), 
                columns= ['Close'] + ['Close' + str(i) for i in range(1,20)])

如果我正确理解了您评论中对 Target 列的要求,您希望将 df1 的 Target 列中的每 20 个值(包括第 1 行值)存储到 new_df 中您可以使用 iloc一样的:

new_df['Target'] = df1.iloc[::20].tolist()

【讨论】:

  • 是的,您的假设是正确的,我尝试使用您的代码,但收到此错误:ValueError: cannot reshape array of size 12246 into shape (20)。我试图通过了解重塑和 sintax 来解决问题,不幸的是我对 python 没有信心,但如果我找不到解决方案,我会回信给你。同时感谢您的好意!
  • @AlexanderGechev 我会告诉你原因,因为当你使用reshape(-1, 20)时,这意味着我们想要将我们的DataFrame重塑为一个二维数组,列数为20,数字该方法通过将您的情况中的值 12246 除以 20 来推断行数。由于 12246 不是 20 的倍数,因此您将收到此错误。您必须添加 14 行虚拟行或删除 6 行以使其成为 20 的倍数。
  • 我做到了! new_df_targets = pd.DataFrame(columns = ['Target']); new_df_targets['Target'] = normalized_amazon_df['Target'].iloc[::39]; new_df_close = pd.DataFrame(normalized_amazon_df['Close'].values.reshape(-1, 39), columns= ['Close'] + ['Close' + str(i) for i in range(1,39)]).reset_index(drop=True); new_df = pd.concat((new_df_targets, new_df_close), axis=1); 对于我想做的测试,这已经足够了,但最终考虑创建假人是件好事。非常感谢您的耐心等待,尽管我的英语不好,但您对我真的很好
  • @AlexanderGechev 完全没问题。真的很高兴我的回答能帮到你。请不要再担心你的英语,它已经足够好了。 :) 如果对您有帮助,如果您能将答案标记为“已接受”,我将不胜感激。谢谢:)
猜你喜欢
  • 2020-05-22
  • 2020-08-04
  • 2019-03-07
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多