Как добавить несколько фреймов данных с одинаковым префиксом в python

У меня есть несколько последовательных фреймов данных, например:

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 распознавать их как объекты данных, которые я создал?

на вашем месте я создам список, содержащий все эти кадры данных. то есть df = [df1, df2, df3, df4]. Вы упомянули, что у вас есть 20 фреймов данных, и мне трудно поверить, что все они закодированы вручную. Если кадры данных исходят из итерируемого объекта, я предлагаю также сохранить этот результат в итерируемом...

Aditya Santoso 08.04.2019 06:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
1
478
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых, я должен подчеркнуть, что это указывает на проблему в способе создания исходных фреймов данных, и вам следует заняться ее исправлением.

С 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 и выше.

Chris 08.04.2019 06:30
Ответ принят как подходящий

Вы двигались в правильном направлении, просто используйте eval:

tempdf = df1
for i in range(2,4):
     tempdf = tempdf.append(eval("df"+str(i)))
     print(tempdf)

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

Согласен, это плохая практика, но в случае OP это кажется самым простым альтернативным решением.

hacker315 08.04.2019 07:23

Другие вопросы по теме