【问题标题】:create multiple class objects with a loop in python在python中使用循环创建多个类对象
【发布时间】:2021-10-06 04:37:42
【问题描述】:

我想以如下所示的形式创建 120 个对象。 但它太长了。 你会如何用循环来做,这样代码会更短?

import numpy as np
import pandas as pd
import scipy.stats as stats

np.df1 = pd.read_csv('C:/Users/.../0Grad.csv', delimiter=';')
np.df_1 = np.df1['Magnitude']
d1 = np.array(np.df_1.iloc[0:10])
d2 = np.array(np.df_1.iloc[10:20])
d3 = np.array(np.df_1.iloc[20:30])
d4 = np.array(np.df_1.iloc[30:40])
d5 = np.array(np.df_1.iloc[40:50])
...
d120 = np.array(np.df_1.iloc[1190:1200])

【问题讨论】:

  • 这能回答你的问题吗? How do I create variable variables?
  • 不要使用像np.df1 这样的名称。 np 是您导入的模块。你不应该添加任何东西,只需写df=pd.read...。而你所说的df_1 是一个系列,是框架的一列。

标签: python pandas numpy for-loop while-loop


【解决方案1】:
In [213]: import pandas as pd

制作一个数据框,就像读取文件一样:

In [214]: df = pd.DataFrame(np.arange(100), columns=['mag'])
In [215]: df
Out[215]: 
    mag
0     0
1     1
2     2
3     3
4     4
..  ...
95   95
96   96
97   97
98   98
99   99

[100 rows x 1 columns]

选择一列,得到一个熊猫系列:

In [216]: s = df['mag']
In [217]: s
Out[217]: 
0      0
1      1
2      2
3      3
4      4
      ..
95    95
96    96
97    97
98    98
99    99
Name: mag, Length: 100, dtype: int64

将系列作为 numpy 数组(或从系列派生的数组):

In [218]: s.to_numpy()
Out[218]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
       85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])

使用np.split 将数组分成10 个大小相等的数组。结果是一个列表。无需将它们单独分配给变量。

In [219]: np.split(s.to_numpy(),10)
Out[219]: 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),
 array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),
 array([30, 31, 32, 33, 34, 35, 36, 37, 38, 39]),
 array([40, 41, 42, 43, 44, 45, 46, 47, 48, 49]),
 array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59]),
 array([60, 61, 62, 63, 64, 65, 66, 67, 68, 69]),
 array([70, 71, 72, 73, 74, 75, 76, 77, 78, 79]),
 array([80, 81, 82, 83, 84, 85, 86, 87, 88, 89]),
 array([90, 91, 92, 93, 94, 95, 96, 97, 98, 99])]

如果你不了解数组列表而不是赋值给单个变量的逻辑,你需要阅读一些更基础的 Python。

【讨论】:

    【解决方案2】:

    你可以使用字典。

    d = {}
    for idx in range(0, 121):
        d[f'd{idx}'] = np.array(np.df_1.iloc[(idx*10):(idx*10)+10])
    

    上面的代码将创建一个字典d,其中包含键d1, d1, ..., d120

    请注意,我假设 iloc[1190:2000] 是一个错字,而您实际上是指 iloc[1990:2000]

    【讨论】:

      【解决方案3】:

      大概

      import numpy as np
      import pandas as pd
      import scipy.stats as stats
      
      np.df1 = pd.read_csv('C:/Users/.../0Grad.csv', delimiter=';')
      np.df_1 = np.df1['Magnitude']
      d = []
      for i in range(0,1180,10):
          d.append(np.array(np.df_1.iloc[i:i+10]))
      d.append(np.array(np.df_1.iloc[1190:2000]))
      

      【讨论】:

        【解决方案4】:

        你可以试试这样的:

        import numpy as np
        import pandas as pd
        import scipy.stats as stats
        
        np.df1 = pd.read_csv('C:/Users/.../0Grad.csv', delimiter=';')
        np.df_1 = np.df1['Magnitude']
        
        li = []
        x = 0
        y = 10
        counter = 1
        
        while counter <= 120:
            li.append(np.array(np.df_1.iloc[x:y]))
            x += y
            y += y
        

        那么你应该有一个列表中的首选结果。

        【讨论】:

          【解决方案5】:

          您可以使用 for 循环来执行此操作

          dx_list = []
          for x in range(0,120,10):
             dx = np.array(np.df_1.iloc[x:x+10]) 
             dx_list .append("orange") ...
          

          【讨论】:

            猜你喜欢
            • 2014-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-14
            • 1970-01-01
            • 1970-01-01
            • 2018-01-16
            • 2014-12-08
            相关资源
            最近更新 更多