【问题标题】:Pandas for loop to copy columns to separate dataframe, rename df accordinglyPandas for 循环将列复制到单独的数据框,相应地重命名 df
【发布时间】:2019-01-11 19:04:54
【问题描述】:

我正在尝试获取一个数据框,从第二个开始遍历每一列,然后将第一个常量列 + 下一个一个一个地复制到新的数据框。

df = pd.DataFrame({'Year':[2001 ,2002, 2003, 2004, 2005], 'a': [1,2, 3, 4, 5], 'b': [10,20, 30, 40, 50], 'c': [0.1, 0.2, 0.3, 0.4,0.5]})
df

要获得与此输出类似的结果,但我需要它循环,因为我最多可以有 40 列来运行逻辑。

df_a=pd.DataFrame()
df_a=df[['Year', 'a']].copy()
df_b=df[['Year', 'b']].copy()
df_c=df[['Year', 'c']].copy()
print(df_a)
print(df_b)
print(df_c)

如果我知道如何命名 df_['它正在复制的列的名称'],那就太好了。非常感谢,如有重复,请见谅。

【问题讨论】:

    标签: python pandas loops dataframe


    【解决方案1】:

    我建议通过 dict 理解将其拆分,然后您将拥有一个包含单独数据框的字典。例如:

    dict_of_frames = {f'df_{col}':df[['Year', col]] for col in df.columns[1:]}
    

    为您提供 df_adf_bdf_c 的字典,您可以像访问任何其他字典一样访问它们:

    >>> dict_of_frames['df_a']
       Year  a
    0  2001  1
    1  2002  2
    2  2003  3
    3  2004  4
    4  2005  5
    
    >>> dict_of_frames['df_b']
       Year   b
    0  2001  10
    1  2002  20
    2  2003  30
    3  2004  40
    4  2005  50
    

    【讨论】:

    • 非常感谢@sacul!还有一个 Q,所以如果我需要遍历这些帧,我应该这样做: for i in range (1, len(df.columns[4:]): finaldf={dict_of_frames['df_{col}'] for col in df.columns[4:]} ???
    • 我不太清楚你的意思,但我会说:for df in dict_of_frames.keys(): dict_of_frames[df] ...
    • 谢谢@sacul - 你们摇滚!向堆栈溢出社区致敬!
    【解决方案2】:

    您需要制作一个如下所示的数据框字典,其中列名作为键,子数据框作为值。

    df = df.set_index('Year')
    dict_ = {col: df[[col]].reset_index() for col in df.columns}
    

    您可以简单地使用列名来访问字典并获取相应的数据框。

    dict_['a']
    

    输出:

        Year    a
    0   2001    1
    1   2002    2
    2   2003    3
    3   2004    4
    4   2005    5
    

    您可以通过以下方式遍历dict_

    for col, df in dict_.items():
        print("-"*40) #just for separation
        print(df) #or print(dict_[col])
    

    输出:

    ----------------------------------------
       Year  a
    0  2001  1
    1  2002  2
    2  2003  3
    3  2004  4
    4  2005  5
    ----------------------------------------
       Year   b
    0  2001  10
    1  2002  20
    2  2003  30
    3  2004  40
    4  2005  50
    ----------------------------------------
       Year    c
    0  2001  0.1
    1  2002  0.2
    2  2003  0.3
    3  2004  0.4
    4  2005  0.5
    

    【讨论】:

    • 再一次,我们得到了相同的基本答案!
    • 你在我之前发布了 x 秒。我想,我应该很快。 @sacul。 :P
    • 谢谢! @harvpan!对不起,我问了上面这个,所以如果我需要遍历这些帧,我应该这样做: for i in range (1, len(df.columns[4:]): finaldf={dict_of_frames['df_{col}' ] for col in df.columns[4:]} ???
    • @MarinaGoldylocks 查看编辑。我希望这可以清除您如何遍历 dict_ 。告诉我进展如何。
    • 谢谢你,@harvpan - 非常有帮助!一切正常!
    【解决方案3】:

    您不需要创建字典来复制和访问您需要的数据。您可以简单地复制您的数据框(如果您有可变元素,则深复制),然后使用索引来访问特定系列:

    dfs = df.set_index('Year').copy()
    
    print(dfs['a'])
    
    Year
    2001    1
    2002    2
    2003    3
    2004    4
    2005    5
    Name: a, dtype: int64
    

    您可以通过pd.DataFrame.iteritems 遍历您的列:

    for key, series in dfs.iteritems():
        print(key, series)
    

    是的,这提供了系列,但它们可以通过series.reset_index()series.to_frame() 轻松转换为数据帧。

    【讨论】:

    • 谢谢你,@jpp - 这是一个不错的选择!
    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 2021-02-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多