#python #pandas #dataframe
Вопрос:
У меня есть несколько финансовых отчетов, и не во всех из них есть одинаковые записи — в некоторых записей больше, чем в других, — и я хотел бы объединить их все в одну, в которой есть все записи.
Я смог сделать это вручную в Excel, так как их не так много, но я хотел бы, чтобы компьютер сделал это дважды, чтобы проверить, что я получил их все.
Итак, вот что я сделал: я создал фрейм данных, в котором в каждом столбце указаны имена записей из одного из финансовых отчетов.
Финансовая отчетность1 | Финансовая отчетность2 | Финансовая отчетность3 |
---|---|---|
поступления | поступления | поступления |
Выручка1 | Выручка1 | Выручка1 |
Выручка2 | Выручка2 | Выручка2 |
расходы | расходы | Выручка3 |
Расходы 1 | Расходы 1 | расходы |
Расходы 2 | прибыль | Расходы 1 |
Расходы 3 | — | Расходы 2 |
прибыль | — | прибыль |
— | — | — |
Моя идея состояла в том, чтобы запустить скрипт, который проанализировал бы количество ячеек между двумя названиями групп и вернул бы в «Консолидированный» столбец все строки между этими двумя значениями, включая первое, но не последнее.
Мой конечный результат будет выглядеть так:
Финансовая отчетность1 | Финансовая отчетность2 | Финансовая отчетность3 | Объединенный |
---|---|---|---|
поступления | поступления | поступления | поступления |
Выручка1 | Выручка1 | Выручка1 | Выручка1 |
Выручка2 | Выручка2 | Выручка2 | Выручка2 |
расходы | расходы | Выручка3 | Выручка3 |
Расходы 1 | Расходы 1 | расходы | расходы |
Расходы 2 | прибыль | Расходы 1 | Расходы 1 |
Расходы 3 | — | Расходы 2 | Расходы 2 |
прибыль | — | прибыль | Расходы 3 |
— | — | — | прибыль |
Я новичок в Панд и, до сих пор, вот что я придумал, выполнив поиск здесь в стеке:
df = pd.read_excel(file) df['Consolidated']=0 df.head() df['Consolidated'].iloc[1] = df['FinancialStatement1'][df['FinancialStatement1'].between( 'REVENUES', 'EXPENSES', inclusive=False )].tolist()
Однако этот код дает мне "A value is trying to be set on a copy of a slice from a DataFrame"
. Я пробовал использовать только df.iloc[3,0], но это также не работает. В любом случае, этот код все равно не будет делать то, что я хочу, так как он не выбирает список с большинством элементов между названиями двух групп.
Ответ №1:
Вы можете создать НАБОР всех записей в столбце. НАБОР Python устранит дубликаты. Затем вы приводите список и создаете pd с надмножеством всех записей и присоединяете его обратно к кадру данных.
s = set() for col in df.columns: s |= set(df[col]) l = sorted(list(s - set(['-']))) df1 = pd.DataFrame(l,columns = ['Consolidated']) df = df.join(df1,how='outer').replace(np.nan,'-')
Финансовая отчетность1 | Финансовая отчетность2 | Финансовая отчетность3 | Объединенный | |
---|---|---|---|---|
0 | поступления | поступления | поступления | расходы |
1 | Выручка1 | Выручка1 | Выручка1 | Расходы 1 |
2 | Выручка2 | Выручка2 | Выручка2 | Расходы 2 |
3 | расходы | расходы | Выручка3 | Расходы 3 |
4 | Расходы 1 | Расходы 1 | расходы | прибыль |
5 | Расходы 2 | прибыль | Расходы 1 | поступления |
6 | Расходы 3 | — | Расходы 2 | Выручка1 |
7 | прибыль | — | прибыль | Выручка2 |
8 | — | — | — | Выручка3 |
Комментарии:
1. @acgarcia00 привет. Если это ответ на ваш вопрос, пожалуйста, поставьте галочку, чтобы принять ответ. Спасибо.
Ответ №2:
Если вы хотите просто получить список всех позиций, необходимых для покрытия всех финансовых отчетов, вы можете сделать следующее
l = list(set(df.unstack().values.tolist())) l.sort() l.remove('-') print(l) ['EXPENSES', 'Expense1', 'Expense2', 'Expense3', 'PROFIT', 'REVENUES', 'Revenue1', 'Revenue2', 'Revenue3']
Если вы хотите просто извлечь необходимые доходы:
revs = [val for val in l if 'Revenue' in val] revs.sort() print(revs) ['Revenue1', 'Revenue2', 'Revenue3']
Если вы хотите просто взять на себя необходимые расходы:
exps = [val for val in l if 'Expense' in val] exps.sort() print(exps) ['Expense1', 'Expense2', 'Expense3']
Вы можете объединить данные так, как вы хотите, чтобы добавить столбец в существующий df или создать новый
line_items =['REVENUES'] revs ['EXPENSES'] exps ['PROFIT'] df1 = pd.DataFrame({'consolidated':line_items}) df_final = pd.concat([df,df1], axis=1, ignore_index=True) df_final.columns = ['FinancialStatement1', 'FinancialStatement2', 'FinancialStatement3', 'consollidated'] df_final FinancialStatement1 FinancialStatement2 FinancialStatement3 consollidated 0 REVENUES REVENUES REVENUES REVENUES 1 Revenue1 Revenue1 Revenue1 Revenue1 2 Revenue2 Revenue2 Revenue2 Revenue2 3 EXPENSES EXPENSES Revenue3 Revenue3 4 Expense1 Expense1 EXPENSES EXPENSES 5 Expense2 PROFIT Expense1 Expense1 6 Expense3 - Expense2 Expense2 7 PROFIT - PROFIT Expense3 8 NaN NaN NaN PROFIT