Назовите все строки именем индекса

У меня странная просьба, которую легко понять, но, на мой взгляд, ее очень сложно реализовать. У меня есть фрейм данных, состоящий из нескольких таблиц Excel (с использованием df concat).

Я хотел бы использовать все имена df (имя электронной таблицы Excel) для обозначения всех моих строк, чтобы знать, в какой таблице находится эта строка. Потому что после этого я смешаю эти данные.

Спасибо за ваше время/помощь :)

Используйте имя df в качестве имени строки.

Я считаю, что read_excel возвращает словарь фреймов данных с именем листа в качестве ключа, который вы можете просмотреть в цикле по словарю и добавить каждый фрейм данных в столбец имени листа и сразу после этого pd.concat словарь.

Ze'ev Ben-Tsvi 16.05.2024 11:37

Зеев, как и вчера, большое спасибо за помощь. Однако вы переоцениваете мои возможности Python, хахаха :), но я понял, попробую

moqa 16.05.2024 12:03
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, у нас есть такая книга Excel:

Мы можем использовать pd.read_excel с sheet_name=None, чтобы прочитать это в словарь с именами листов в качестве ключей:

import pandas as pd

file_name = 'myfile.xlsx'

dict_df = pd.read_excel(file_name, sheet_name=None)

dict_df

{'Sheet1':   Col1  Col2
 0    A     1
 1    B     2
 2    C     3,
 'Sheet2':   Col1  Col2
 0    D     4
 1    E     5
 2    F     6}

Теперь мы можем использовать pd.concat , чтобы добавить ключи словаря к значениям индекса. Начиная с pd 2.0.0 вы можете использовать df.add_prefix с axis=0:

# pd >= 2.0.0
df = pd.concat([v.add_prefix(f"{k}_", axis=0) for k, v in dict_df.items()])

df

         Col1  Col2
Sheet1_0    A     1
Sheet1_1    B     2
Sheet1_2    C     3
Sheet2_0    D     4
Sheet2_1    E     5
Sheet2_2    F     6

Для более ранних версий вы можете перезаписать индекс, используя df.set_index:

# pd < 2.0.0
df = pd.concat([v.set_index(f"{k}_" + v.index.astype(str)) 
                for k, v in dict_df.items()])

# same result

Но, возможно, было бы лучше добавить имена листов на отдельном уровне, используя параметры keys и names:

df = pd.concat([v for v in dict_df.values()], 
               keys=dict_df.keys(), 
               names=['Sheets', 'Rows'])

df

            Col1  Col2
Sheets Rows           
Sheet1 0       A     1
       1       B     2
       2       C     3
Sheet2 0       D     4
       1       E     5
       2       F     6

Или просто:

df = pd.concat(dict_df, names=['Sheets', 'Rows'])
# same result

Например, таким образом вы можете легко выбрать конкретный лист:

df.loc['Sheet1']

     Col1  Col2
Rows           
0       A     1
1       B     2
2       C     3

Если вы читаете несколько книг Excel и хотите включить имена файлов, вы можете сделать что-то вроде этого:

workbooks = ['myfile.xlsx', 'myfile2.xlsx'] # `myfile2` here a copy of `myfile`

nested_dict = {(wb,k): v for wb in workbooks 
               for k, v in pd.read_excel(wb, sheet_name=None).items()}

df = pd.concat([v for v in nested_dict.values()], 
               keys=nested_dict.keys(), 
               names=['Filename', 'Sheets', 'Rows'])

df

                         Col1  Col2
Filename     Sheets Rows           
myfile.xlsx  Sheet1 0       A     1
                    1       B     2
                    2       C     3
             Sheet2 0       D     4
                    1       E     5
                    2       F     6
myfile2.xlsx Sheet1 0       A     1
                    1       B     2
                    2       C     3
             Sheet2 0       D     4
                    1       E     5
                    2       F     6

Или еще раз:

df = pd.concat(nested_dict, names=['Filename', 'Sheets', 'Rows'])
# same result

Выбор Sheet1 из первой книги:

df.loc[('myfile.xlsx', 'Sheet1')]

     Col1  Col2
Rows           
0       A     1
1       B     2
2       C     3

Большое спасибо, Уроборос, небольшой вопрос: что такое k и v?

moqa 16.05.2024 12:28

словари в Python представляют собой наборы пар ключ: значение. Итак, обычно используется k: v. Чтобы одновременно просмотреть оба k и v, вы используете dict.items() , чтобы получить только ключи, вы используете dict.keys() ; только значения: dict.values().

ouroboros1 16.05.2024 12:32

У меня есть ошибка numpy: TypeError: объект numpy.ndarray не может быть вызван

moqa 16.05.2024 13:12

На каком этапе опробования какого решения? Тот, у которого одна книга Excel, или тот, у которого их несколько? Какая именно строка выдает ошибку?

ouroboros1 16.05.2024 13:16

Извините, я не могу отправить вам свой сценарий, потому что Стек говорит, что я использую ИИ, а это неправильно, я не могу использовать ИИ.

moqa 16.05.2024 13:30

ниже двух строк: df = pd.concat(pd.read_excel(имя файла, имя_листа = листы), ignore_index = False) df = pd.concat([v для v в df.values()],keys = df.keys() )

moqa 16.05.2024 13:31

Ваша вторая строка не имеет смысла, df на этом этапе уже является правильным pd.DataFrame. Просто pd.concat(pd.read_excel(filename, sheet_name = sheets), ignore_index = False) это то, что вам нужно, нет? Или, добавив names: pd.concat(pd.read_excel(filename, sheet_name = sheets), names=['Sheets', 'Rows']).

ouroboros1 16.05.2024 13:39

Действительно, никакого смысла :) . Большое спасибо за вашу помощь, наше

moqa 16.05.2024 15:05

Оро, Python не нравится режим оси: TypeError: add_prefix() получил неожиданный аргумент ключевого слова «ось», я проверил, и это наверняка моя версия Python, которая не обновляется, у меня есть pandas 0.23.4

moqa 16.05.2024 17:54

Я вижу, что могу добавить префикс к столбцу в DataFrame и добавить префикс к строкам в серии.

moqa 16.05.2024 18:17

Обновлен ответ: вы можете использовать df = pd.concat([v.set_index(f"{k}_" + v.index.astype(str)) for k, v in dict_df.items()]) для версий pd < 2.0.0.

ouroboros1 16.05.2024 18:23

ЭТО РАБОТАЕТ, ТАК, ЧТО ВЫ КАК СЛЕДУЮЩИЙ БИЛЛ ГЕЙТС ИЛИ КАК :)

moqa 17.05.2024 10:21

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