根据变量名称将列添加到数据框

时间:2019-07-02 21:14:04

标签: python pandas

我试图在连接所有数据框之前根据其名称在每个数据框中添加两列。一列是年份,另一列是三个月。所以t1_15会是第三个学期和2015年。

我尝试构建一个可以一次性完成的函数,但是由于时间限制,最终只能像这样手动完成。我现在将花费更多时间返回此问题,并且真的很想解决这个问题。

frames_15 = [t1_15, t2_15, t3_15, t4_15]
for i in frames_15:
    i['year'] = 2015

frames_16 = [t1_16, t2_16, t3_16, t4_16]
for i in frames_16:
    i['year'] = 2016

frames_17 = [t1_17, t2_17, t3_17]
for i in frames_17:
    i['year'] = 2017

frames_trim_1 = [t1_15, t1_16, t1_17]
for i in frames_trim_1:
    i['trimestre'] = 1

frames_trim_2 = [t2_15, t2_16, t2_17]
for i in frames_trim_2:
    i['trimestre'] = 2

frames_trim_3 = [t3_15, t3_16, t3_17]
for i in frames_trim_3:
    i['trimestre'] = 3

frames_trim_4 = [t4_15, t4_16]
for i in frames_trim_4:
    i['trimestre'] = 4

id像每个df一样,都有一个根据其名称组成的年份和三个月的列。

预先感谢

1 个答案:

答案 0 :(得分:2)

最好的方法是建立一个字典,在其中注册数据帧。您已经根据他们每三个月的任务给他们起了名字。 如果您在创建时就已经知道这些信息,则甚至可以在字典中注册这些数据帧,该字典的关键字是三个月和年份的元组。

如果您的描述中有类似内容,您也可以使用globals字典,但这不是很干净,如果没有更简洁的方法,应将其视为最后选择。

如果使用像上面的变量名一样命名的键来构建字典,或者要使用globals字典的直接性,则可以按以下步骤进行操作:

import re
df_directory= dict(globals())
name_re= re.compile('^t([0-9])_([0-9]{2})$')
for name, df in df_directory.items():
    matcher= name_re.match(name)
    if matcher and isinstance(df, pd.DataFrame):
        trimester, year= matcher.groups()
        df['trimestre']= int(trimester)
        df['year']= int(year) + 2000

这将处理由模式tX_XX命名且类型为DataFrame的所有变量,并解析名称中的三个月和年份,以将其分别分配给各列。