У меня есть несколько последовательных фреймов данных, например:
df1 = pd.DataFrame( [['tom', 10], ['nick', 15], ['juli', 14]] , columns = ['Name', 'Age'])
df2 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] , columns = ['Name', 'Age'])
df3 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] , columns = ['Name', 'Age'])
df4 = pd.DataFrame([['tom', 10], ['nick', 15], ['juli', 14]] , columns = ['Name', 'Age'])
Мне нужно создать цикл for, чтобы добавить их и получить новый фрейм данных. Я пробовал приведенные ниже коды, но они не работают, так как python распознает df1 как строку.
tempdf = df1
for i in range(2,4):
tempdf = tempdf.append(("df"+str(i)))
print(tempdf)
Как мне заставить python распознавать их как объекты данных, которые я создал?
Во-первых, я должен подчеркнуть, что это указывает на проблему в способе создания исходных фреймов данных, и вам следует заняться ее исправлением.
С Python есть способы сделать почти все, что вы хотите. Является ли использование такой силы желанный — это совсем другой вопрос.
В этом случае самым безопасным способом, вероятно, будет использование globals()
:
n_dataframes = 4
g = globals()
dataframes = [g[f'df{i}'] for i in range(1, n_dataframes + 1)]
result_df = pd.concat(dataframes)
print(result_df)
Выход:
Name Age
0 tom 10
1 nick 15
2 juli 14
0 tom 10
1 nick 15
2 juli 14
0 tom 10
1 nick 15
2 juli 14
0 tom 10
1 nick 15
2 juli 14
Вы можете выполнить дальнейшую обработку результата, например, вызвать reset_index
.
Другой альтернативой является использование eval
, который решительно уходит на территорию «вы не должны делать этого, если вы действительно не знаете, что делаете», потому что он позволяет выполнять произвольный код:
dataframes = [eval(f'df{i}') for i in range(1, n_dataframes + 1)]
Обратите внимание, что в приведенном выше коде используется f-струны, синтаксис которого появился только в Python 3.6. Соответственно, если ваша версия Python ниже этой, замените f'df{i}'
на 'df{}'.format(i)
.
Кстати, было бы неплохо упомянуть, что f-строка поддерживается только в python 3.6 и выше.
Вы двигались в правильном направлении, просто используйте eval
:
tempdf = df1
for i in range(2,4):
tempdf = tempdf.append(eval("df"+str(i)))
print(tempdf)
Примечание. Использование eval может запускать произвольный код, его использование считается плохой практикой. Пожалуйста, попробуйте использовать другие способы, если это возможно.
Согласен, это плохая практика, но в случае OP это кажется самым простым альтернативным решением.
на вашем месте я создам список, содержащий все эти кадры данных. то есть
df = [df1, df2, df3, df4]
. Вы упомянули, что у вас есть 20 фреймов данных, и мне трудно поверить, что все они закодированы вручную. Если кадры данных исходят из итерируемого объекта, я предлагаю также сохранить этот результат в итерируемом...