Сгруппировать несколько атрибутов и передать результат / сохранить to_excel - PullRequest
0 голосов
/ 09 января 2019

DF;

OpCode         PYear OperationStartDate
0    MCI6AF2   1993           2017-03-24
1    MCI6BF2   1994           2017-03-24
2    APJ5LFC   1975           2017-03-13
3    MQL0AF3   1986           2017-03-16
4    BMR3KFC   1982           2017-03-15
5    BRM1NFC   1981           2017-03-15
6    LNP5GF2   1987           2017-03-16
7       EAS5   1999           2017-03-22
8    HRK1DSC   1971           2017-03-17
9    HRK2FSC   1972           2017-03-17
10   NMI6BF2   1994           2017-03-22
11   NMI6AF2   1994           2017-03-20
12   HHY1JF1   1996           2017-02-01

Я могу группировать, используя один атрибут «код операции», чтобы получить минимальную дату в «OperationStartDate»; передайте эту минимальную дату в объединение и сохраните результат для использования в Excel;

df2 = df.reset_index()
df3 = df2.loc[df2.groupby('OpCode')['LastOperationDate'].idxmin()] #Try df3 = df2.loc[df2.groupby(['OpCode','PYEAR'])['LastOperationDate'].idxmin()]

Переименовать df3 в столбец «LastOperationDate»

df3.rename(columns={'LastOperationDate':'EarliestStartDate'}, inplace=True)


df3.drop(df3.columns[[0,4,1,5,6]], axis=1, inplace=True)


df6 = pd.merge(left = df, right = df3, how ='left', on ='OpCode')

writer = ExcelWriter('C:\Current Projects\Mapping\Python\Process Outputs\Example1321.xlsx')
df6.to_excel(writer,'Sheet1',index=False)
writer.save()

Проблема в том, что если я сгруппирую несколько атрибутов OpCode & PYear, я получаю результат, который я не могу ни передать в объединение, ни сохранить в Excel. В этом случае я использую следующие альтернативные коды:

df3 =df['Operation Start Date'].groupby([df['OpCode'], df['PYear']]).min()

df4= df.groupby(['OpCode', 'PYear'])['Operation Start Date'].apply(lambda x : x.min())

Мой результат;

 Op Code                P Year                
ANN3EF1                1994                     2017-08-29
APJ5LFC                1975                     2017-03-13
APJ6EFC                1977                     2017-10-09
APJ6GFC                1976                     2017-09-04
APJ6HFC                1975                     2017-09-07
APJ6JFC                1977                     2017-07-27
AYN4RFC                1968                     2017-11-13
AYN6CF1                1984                     2017-03-31
AYN6CF3                1984                     2017-08-29
AYN6DF3                1985                     2017-09-05
AZZ7AF1                2004                     2017-08-04

Кто-нибудь знает, как я могу передать это в следующее соединение;

df6 = pd.merge(left = df, right = df3, how ='left', on ='OpCode')

ИЛИ добавить заголовок столбца к выходным данным

ИЛИ Сохранить в Excel

1 Ответ

0 голосов
/ 09 января 2019

Вам не нужно вступать, вы можете просто сделать transform здесь:

# make sure the date is in correct format
df['Operation Start Date'] = pd.to_datetime(df['Operation Start Date'])

df['min_date'] = df.groupby(['OpCode', 'PYear'])['Operation Start Date'].transform('min')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...