Python, циклы с изменяемыми частями имен файлов - PullRequest
1 голос
/ 29 мая 2020

У меня есть несколько очень похожих команд, которые все выглядят так (df означает pandas dataframe):

df1_part1=...
df1_part2=...
...
df1_part5=...
df2_part1=...

Я хотел бы сделать для него al oop, а именно:

for i in range(1,5):
for j in range(1,5):
df%i_part%j=...

Конечно, с% не работает. Но я полагаю, это должен быть какой-то простой способ сделать это. Не могли бы вы мне помочь?

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Вы можете попробовать один из следующих вариантов:

  1. Создайте словарь, который отображает ваш df и получает к нему доступ по имени фрейма данных:
mapping = {"df1_part1": df1_part1, "df1_part2": df1_part2}
for i in range(1,5):
    for j in range(1,5):
        mapping[f"df{i}_part{j}"] = ...
Используйте globals для динамического доступа к вашим переменным:
df1_part1=...
df1_part2=...
...
df1_part5=...
df2_part1=...

for i in range(1,5):
    for j in range(1,5):
        globals()[f"df{i}_part{j}"] = ...
0 голосов
/ 29 мая 2020

Предполагая, что этот процесс является частью подготовки данных, я хотел бы упомянуть, что вы должны стараться работать с «конвейерами подготовки данных», когда это возможно. В противном случае через пару месяцев код будет огромным беспорядком для чтения.

Есть несколько способов решения этой проблемы.

Словарь - самый простой способ справиться с этим.

df_parts = {
            'df1' : {'part1': df1_part1, 'part2': df1_part2,...,'partN': df1_partN},
            'df2' : {'part1': df1_part1, 'part2': df1_part2,...,'partN': df2_partN},
            '...' : {'part1': ..._part1, 'part2': ..._part2,...,'partN': ..._partN},
            'dfN' : {'part1': dfN_part1, 'part2': dfN_part2,...,'partN': dfN_partN},
           }

# print parts from `dfN`
for val in for df_parts['dfN'].values():
    print(val)

# print part1 for all dfs
for df in df_parts.values():
    print(df['part1'])

# print everything
for df in df_parts:
    for val in df_parts[df].values():
        print(val)

Хорошая вещь в этом подходе состоит в том, что вы можете перебирать весь словарь, но вы не включаете range, что может сбивать с толку позже. Кроме того, лучше назначать каждую df_part напрямую dict вместо назначения N*N переменных, которые можно использовать один или два раза. В этом случае вы можете просто использовать 1 переменную и повторно назначать ее по мере продвижения:

# code using df1_partN
df1 = df_parts['df1']['partN']
# stuff to do
# happy? checkpoint
df_parts['df1']['partN'] = df1
0 голосов
/ 29 мая 2020

Одним из способов было бы собрать ваши pandas фреймы данных в список списков и перебирать этот список вместо того, чтобы пытаться динамически анализировать ваш python код.

df1_part1=...
df1_part2=...
...
df1_part5=...
df2_part1=...

dflist = [[df1_part1, df1_part2, df1_part3, df1_part4, df1_part5],
          [df2_part1, df2_part2, df2_part3, df2_part4, df2_part5]]
for df in dflist:
    for df_part in df:
        # do something with df_part
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...