有没有一种方法可以遍历列表并返回以其内容命名的变量?

2024-09-29 23:22:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个按日期组织的熊猫数据框,我试图按年份(在一个名为“年”的列中)拆分。我想每年返回一个数据帧,名称类似于“df19XX”。你知道吗

我想写一个“For”循环来处理这个。。。有点像。。。你知道吗

for d in [1980, 1981, 1982]:
    df(d) = df[df['year']==d]

。。。它将返回三个数据帧,分别称为df1980、df1981和df1982。你知道吗

谢谢!你知道吗


Tags: 数据in名称dfforyear年份df1980
2条回答

您可以遍历groupby:

In [11]: df = pd.DataFrame({"date": pd.date_range("2012-12-28", "2013-01-03"), "A": np.random.rand(7)})

In [12]: df
Out[12]:
          A       date
0  0.434715 2012-12-28
1  0.208877 2012-12-29
2  0.912897 2012-12-30
3  0.226368 2012-12-31
4  0.100489 2013-01-01
5  0.474088 2013-01-02
6  0.348368 2013-01-03

In [13]: g = df.groupby(df.date.dt.year)

In [14]: for k, v in g:
    ...:     print(k)
    ...:     print(v)
    ...:     print()
    ...:
2012
          A       date
0  0.434715 2012-12-28
1  0.208877 2012-12-29
2  0.912897 2012-12-30
3  0.226368 2012-12-31

2013
          A       date
4  0.100489 2013-01-01
5  0.474088 2013-01-02
6  0.348368 2013-01-03

我认为最好是让dict有变量,然后在locals()字典里乱来(我声称使用locals(),所以不是“pythonic”):

In [14]: {k: grp for k, grp in g}
Out[14]:
{2012:           A       date
 0  0.434715 2012-12-28
 1  0.208877 2012-12-29
 2  0.912897 2012-12-30
 3  0.226368 2012-12-31, 2013:           A       date
 4  0.100489 2013-01-01
 5  0.474088 2013-01-02
 6  0.348368 2013-01-03}

尽管您可能会考虑动态计算(而不是存储在dict或变量中)。您可以使用^{}

In [15]: g.get_group(2012)
Out[15]:
          A       date
0  0.865239 2012-12-28
1  0.019071 2012-12-29
2  0.362088 2012-12-30
3  0.031861 2012-12-31

像这样的?同时使用@Andy的df

variables = locals()
for i in [2012, 2013]:
    variables["df{0}".format(i)]=df.loc[df.date.dt.year==i]
df2012
Out[118]: 
          A       date
0  0.881468 2012-12-28
1  0.237672 2012-12-29
2  0.992287 2012-12-30
3  0.194288 2012-12-31
df2013
Out[119]: 
          A       date
4  0.151854 2013-01-01
5  0.855312 2013-01-02
6  0.534075 2013-01-03

相关问题 更多 >

    热门问题