Как извлечь все ячейки между двумя другими ячейками в Панд из столбца с большинством ячеек между этими двумя другими ячейками?

#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