У меня странная просьба, которую легко понять, но, на мой взгляд, ее очень сложно реализовать. У меня есть фрейм данных, состоящий из нескольких таблиц Excel (с использованием df concat).
Я хотел бы использовать все имена df (имя электронной таблицы Excel) для обозначения всех моих строк, чтобы знать, в какой таблице находится эта строка. Потому что после этого я смешаю эти данные.
Спасибо за ваше время/помощь :)
Используйте имя df в качестве имени строки.
Зеев, как и вчера, большое спасибо за помощь. Однако вы переоцениваете мои возможности Python, хахаха :), но я понял, попробую






Предположим, у нас есть такая книга 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?
словари в Python представляют собой наборы пар ключ: значение. Итак, обычно используется k: v. Чтобы одновременно просмотреть оба k и v, вы используете dict.items() , чтобы получить только ключи, вы используете dict.keys() ; только значения: dict.values().
У меня есть ошибка numpy: TypeError: объект numpy.ndarray не может быть вызван
На каком этапе опробования какого решения? Тот, у которого одна книга Excel, или тот, у которого их несколько? Какая именно строка выдает ошибку?
Извините, я не могу отправить вам свой сценарий, потому что Стек говорит, что я использую ИИ, а это неправильно, я не могу использовать ИИ.
ниже двух строк: df = pd.concat(pd.read_excel(имя файла, имя_листа = листы), ignore_index = False) df = pd.concat([v для v в df.values()],keys = df.keys() )
Ваша вторая строка не имеет смысла, 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']).
Действительно, никакого смысла :) . Большое спасибо за вашу помощь, наше
Оро, Python не нравится режим оси: TypeError: add_prefix() получил неожиданный аргумент ключевого слова «ось», я проверил, и это наверняка моя версия Python, которая не обновляется, у меня есть pandas 0.23.4
Я вижу, что могу добавить префикс к столбцу в DataFrame и добавить префикс к строкам в серии.
Обновлен ответ: вы можете использовать df = pd.concat([v.set_index(f"{k}_" + v.index.astype(str)) for k, v in dict_df.items()]) для версий pd < 2.0.0.
ЭТО РАБОТАЕТ, ТАК, ЧТО ВЫ КАК СЛЕДУЮЩИЙ БИЛЛ ГЕЙТС ИЛИ КАК :)
Я считаю, что read_excel возвращает словарь фреймов данных с именем листа в качестве ключа, который вы можете просмотреть в цикле по словарю и добавить каждый фрейм данных в столбец имени листа и сразу после этого pd.concat словарь.