动态创建DF并使用循环过滤

时间:2019-06-04 12:24:24

标签: python pandas dataframe

循环执行此操作的最佳做​​法是什么?

我想过滤并动态创建新的DF

df_aus19 = df_mat.loc[(df_temp['Year'] == 2020 ) & (df_mat['Country'] == 'AUS')]
df_aus20 = df_mat.loc[(df_temp['Year'] == 2020 ) & (df_mat['Country'] == 'AUS')]
df_aus21 = df_mat.loc[(df_temp['Year'] == 2021 ) & (df_mat['Country'] == 'AUS')]
df_aus22 = df_mat.loc[(df_temp['Year'] == 2022 ) & (df_mat['Country'] == 'AUS')]
df_aus23 = df_mat.loc[(df_temp['Year'] == 2023 ) & (df_mat['Country'] == 'AUS')]

每个代码的AS

2 个答案:

答案 0 :(得分:1)

列表理解是比循环和动态创建全局变量更多的Python解决方法:

years = list(range(2019, 2024))
df_aus_list = [df_mat.loc[(df_temp['Year'] == i) & (df_mat['Country'] == 'AUS')] for i in years]

如果您确实需要产生与代码相同的结果,则可以动态创建新的全局变量,如下所示:

years = list(range(2019, 2024))
for i in years:
    globals()["df_aus"+str(i % 100)] = df_mat.loc[(df_temp['Year'] == i ) & (df_mat['Country'] == 'AUS')]

答案 1 :(得分:1)

不要。只是不要。当您准备好动态创建新变量时,请避免:难以获取且难以维护。只需使用字典或列表之类的容器即可。

在大熊猫中获取该信息的常用方法是group_by

dfs = dict()
for (year, country), sub in df.groupby(['Year', 'Country']):
  # if 2020 <= year <= 2023 and county == 'AUS':     # filter optionaly
      dfs[(year, country)] = sub

然后您可以获取dfs[(2021, 'AUS')]的AUS和2021数据框