循环用熊猫将列复制到单独的数据框,相应地重命名df

时间:2018-08-03 21:21:09

标签: python pandas loops dataframe

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

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_ ['正在复制的列的名称'],那也很好。非常感谢,如果重复的话,对不起。

3 个答案:

答案 0 :(得分:2)

我建议通过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

答案 1 :(得分:1)

您需要制作一个像下面这样的数据帧字典,以列名作为键,并将子数据帧作为值。

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

答案 2 :(得分:0)

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

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()轻松地将它们转换为数据帧。