【问题标题】:How to use variable names iteratively in a loop in python/pandas如何在 python/pandas 的循环中迭代地使用变量名
【发布时间】:2019-08-20 07:44:41
【问题描述】:

这似乎是一个很常见的问题,但我的问题略有不同。我搜索过的大部分问题;给出了如何迭代地创建不同的变量。但是我想迭代地使用那些已经在字典中的变量。

考虑使用 pandas,假设我定义了 3 个数据帧 df_E1、df_E2、df_E3。它们每个都有名称、日期、用途等列。

假设我想从所有这些中打印描述。 df_E1.describe()、df_E2.describe()、df_E3.describe()。现在,如果我有 20-30 个这样的数据帧并且我想在 for 循环中从 df_E{number}.describe() 进行描述,而不是一一打印,该怎么办。我该怎么做?

df_E1 = {'name':['john','tom','barney','freddie'], 'number':['3','4','5','6'], 'description':['a','b','c','d']}
df_E2 = {'name':['andy','candy','bruno','mars'], 'number':['1','2','5','8'], 'description':['g','h','j','k']}
df_E3 = {'name':['donald','trump','harry','thomas'], 'number':['9','4','5','7'], 'description':['c','g','j','r']}
df_E1 = pd.DataFrame(df_E1)
df_E2 = pd.DataFrame(df_E2)
df_E3 = pd.DataFrame(df_E3)
print(df_E1.head())
print(df_E2.head())
print(df_E3.head())

#### instead of above three statements, is there any way I can print them in a 
#### for loop. Below does not work as it gives just the string printed.
for i in range(1,4):
  print(str('df_E')+str(i))

### Now if I am able to print dataframes somehow, I will be able to use all 
### these in a loop. Eg. if I need to print describe of these, I will be able 
### to do it in for loop:

for i in range(1,4):
  print((str('df_E')+str(i)).describe()) // something like this which works

这并没有反映已经提出的问题,因为他们更多地关注在 for 循环中将变量创建为字符串,我知道这可以使用字典来完成。但在这里,要求是使用已经存在的变量

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    这里最好使用dict:

    d = {'df_E1':df_E1, 'df_E2':df_E2, 'df_E3':df_E3}
    print (d)
    {'df_E1':       name number description
    0     john      3           a
    1      tom      4           b
    2   barney      5           c
    3  freddie      6           d, 'df_E2':     name number description
    0   andy      1           g
    1  candy      2           h
    2  bruno      5           j
    3   mars      8           k, 'df_E3':      name number description
    0  donald      9           c
    1   trump      4           g
    2   harry      5           j
    3  thomas      7           r}
    
    for k, v in d.items():
        print (v.describe())
            name number description
    count      4      4           4
    unique     4      4           4
    top     john      5           b
    freq       1      1           1
             name number description
    count       4      4           4
    unique      4      4           4
    top     bruno      5           g
    freq        1      1           1
             name number description
    count       4      4           4
    unique      4      4           4
    top     harry      5           r
    freq        1      1           1
    

    但是有没有可能,但不是recommended,有globals:

    for i in range(1,4):
        print(globals()[str('df_E')+str(i)])
    
          name number description
    0     john      3           a
    1      tom      4           b
    2   barney      5           c
    3  freddie      6           d
        name number description
    0   andy      1           g
    1  candy      2           h
    2  bruno      5           j
    3   mars      8           k
         name number description
    0  donald      9           c
    1   trump      4           g
    2   harry      5           j
    3  thomas      7           r
    

    【讨论】:

    • 谢谢,这是您提到的我正在寻找的第一种方式,但可以添加一个东西,正如我在下面的代码中提到的那样,以便我们按顺序获取字典(如字典中,顺序可能不是维护{是的,可以使用orderedDict}): ``` for i in range(len(d)): print (d[str('df_E')+str(i)].describe()) ```
    • @TusharSeth - 是的,但必须先创建字典。订单也取决于 python 的版本,如果使用 python 3.6,那么内置 dict 将被订购,如果不是 orderedDict
    【解决方案2】:

    您可以简单地通过使用eval() 函数来做到这一点,但它是不赞成的:

    for i in range(1, 4):
        print(eval('df_E{}.describe()'.format(i)))
    

    这里是link,说明为什么它被认为是一种不好的做法

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2014-03-24
      • 2015-04-21
      • 2014-11-09
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多