объединить две полные строки, если соблюдены определенные критерии - PullRequest
0 голосов
/ 31 марта 2020

Мне удалось извлечь данные из двух отдельных xlsx и объединить их в один лист xlsx, используя pandas.

Я знаю, что у меня есть таблица, которая выглядит следующим образом.

Home                Start Date     Gross Earning Tax Gross Rental Commission Net Rental
3157    2020-03-26 00:00:00 -268.8  -28.8   -383.8  -36 -338.66
3157    2020-03-26 00:00:00 268.8   28.8    153.8   36  108.66
3157    2020-03-24 00:00:00 264.32  28.32   149.32  35.4    104.93
3157    2020-03-13 00:00:00 625.46  67.01   510.46  83.7675 405.4225
3157    2020-03-13 00:00:00 558.45  0   443.45  83.7675 342.9325
3157    2020-03-11 00:00:00 142.5   0   27.5    21.375  1.855
3157    2020-03-11 00:00:00 159.6   17.1    44.6    21.375  17.805
3157    2020-03-03 00:00:00 349.52  0   234.52  52.428  171.612
3157    2020-03-03 00:00:00 391.46  41.94   276.46  52.428  210.722

enter image description here

Итак, если вы посмотрите на первые две строки, имя в столбце Home будет тем же (в этом примере 3157 Tocoa) но они также одинаковы для следующих нескольких рядов. Но в столбце «Дата начала» только первые два элемента в этом столбце совпадают (в данном случае, 26.03.20, 12:00:00). Поэтому мне нужно сделать следующее:

Если даты совпадают, а дом совпадает, тогда мне нужна сумма всех следующих столбцов. (В этом случае мне понадобится сумма -268,8 и 268,8, сумма -28,8 и 28,8 и т. Д.) Также важно упомянуть, что есть случаи, когда в общей сложности более двух совпадающих дат начала.

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

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import numpy as np
import matplotlib.pyplot as plt
import os

# class airbnb:

#Gets the location path for the reports that come raw from the channel
airbnb_excel_file = (r'C:\Users\Christopher\PycharmProjects\Reporting with 
python\Data_to_read\Bnb_feb_report.xlsx')
empty_excel_file = (r'C:\Users\Christopher\PycharmProjects\Reporting with 
python\Data_to_read\empty.xlsx')

#Defines the data frame
df_airbnb = pd.read_excel(airbnb_excel_file)
df_empty = pd.read_excel(empty_excel_file)

gross_earnings = df_airbnb['Gross Earnings']
tax_amount = df_airbnb['Gross Earnings'] * 0.06
gross_rental = df_airbnb['Gross Earnings'] - df_airbnb['Cleaning Fee']
com = ((gross_rental - tax_amount) + df_airbnb['Cleaning Fee']) * 0.15
net_rental = (gross_rental - (com + df_airbnb['Host Fee']))
house = df_airbnb['Listing']
start_date = df_airbnb['Start Date']

# df = pd.DataFrame(df_empty)
# df_empty.replace('nan', '')
#
# print(net_rental)

df_report = pd.DataFrame(
    {'Home': house, 'Start Date': start_date, 'Gross Earning': gross_earnings, 'Tax': tax_amount,
     'Gross Rental': gross_rental, 'Commission': com, 'Net Rental': net_rental})

df_report.loc[(df_report.Home == 'New house, Minutes from Disney & Attraction'), 'Home'] = '3161 
Tocoa'
df_report.loc[(df_report.Home == 'Brand-New House, located minutes from Disney 5151'), 'Home'] = 
'5151 Adelaide'
df_report.loc[(df_report.Home == 'Luxury House, Located Minutes from Disney-World 57'), 'Home'] = 
'3157 Tocoa'
df_report.loc[(df_report.Home == 'Big house, Located Minutes from Disney-World 55'), 'Home'] = '3155 
Tocoa'

df_report.sort_values(by=['Home'], inplace=True)

# writer = ExcelWriter('Final_Report.xlsx')
# df_report.to_excel(writer, 'sheet1', index=False)
# writer.save()



# class homeaway:
homeaway_excel_file = (r'C:\Users\Christopher\PycharmProjects\Reporting with 
python\Data_to_read\PayoutSummaryReport2020-03-01_2020-03-29.xlsx')
df_homeaway = pd.read_excel(homeaway_excel_file)

cleaning = int(115)

house = df_homeaway['Address']
start_date = df_homeaway['Check-in']
gross_earnings = df_homeaway['Gross booking amount']
taxed_amount = df_homeaway['Lodging Tax Owner Remits']
gross_rental = (gross_earnings - cleaning)
com = ((gross_rental-taxed_amount) + cleaning) * 0.15
net_rental = (gross_rental - (com + df_homeaway['Deductions']))

df_report2 = pd.DataFrame(
    {'Home': house, 'Start Date': start_date, 'Gross Earning': gross_earnings, 'Tax': taxed_amount,
     'Gross Rental': gross_rental, 'Commission': com, 'Net Rental': net_rental})

# writer = ExcelWriter('Final_Report2.xlsx')
# df_report2.to_excel(writer, 'sheet1', index=False)
# writer.save()


df_combined = pd.concat([df_report, df_report2])

writer = ExcelWriter('Final_Report_combined.xlsx')
df_report2.to_excel(writer, 'sheet1', index=False)
writer.save()

1 Ответ

0 голосов
/ 31 марта 2020

Один из возможных подходов - сгруппировать по Home и Start Date , а затем вычислить sum задействованных строк:

df.groupby(['Home', 'Start Date']).sum()

К счастью, все «другие» столбцы имеют номера c, поэтому спецификация столбца не требуется.

Но если имеется более 2 строк с такими же Home и Дата начала , и вы хотите:

  • разбить их на пары последовательных строк,
  • и затем вычислить их суммы (для каждого пара отдельно),

Вы должны применить «2-уровневую» группировку:

  • первый уровень - группировка по Home и Start Дата (как и прежде),
  • второй уровень - группировка по парам,

и вычисление сумм для каждой группы второго уровня.

В этом случае код должен быть:

df.groupby(['Home', 'Start Date']).apply(
    lambda grp: grp.groupby(np.arange(len(grp.index)) // 2).sum())\
    .reset_index(level=-1, drop=True)

Дополнительная операция, необходимая здесь, - сбросить последний уровень индекса ( reset_index ).

Для проверки этого подхода, например, добавить народ нижний ряд к вашему DataFrame:

1234 Bogus Street,2020-03-26 00:00:00,20.0,2.0,15.0,3,10.0

, так что группа 1234 Bogus Street / 2020-03-26 00: 00: 00 теперь содержит три строки.

Когда вы запустите указанный выше код, вы получите:

                                       Gross Earning    Tax  Gross Rental  Commission  Net Rental
Home              Start Date                                                                     
1234 Bogus Street 2020-03-03 00:00:00         740.98  41.94        510.98     104.856     382.334
                  2020-03-11 00:00:00         302.10  17.10         72.10      42.750      19.660
                  2020-03-13 00:00:00        1183.91  67.01        953.91     167.535     748.355
                  2020-03-24 00:00:00         264.32  28.32        149.32      35.400     104.930
                  2020-03-26 00:00:00           0.00   0.00       -230.00       0.000    -230.000
                  2020-03-26 00:00:00          20.00   2.00         15.00       3.000      10.000

Обратите внимание на последнюю строку. Он содержит:

  • повтор Дата начала (из предыдущего ряда),
  • значений из добавленного ряда.

И последняя, ​​кроме одной строки, содержит суммы для только двух первых строк с соответствующими Home / Дата начала .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...