Python объединение строк с условной логикой - PullRequest
1 голос
/ 25 марта 2020

Впервые до Python, поэтому, пожалуйста, извините за плохую артикуляцию. У меня есть некоторые данные в кадре данных, к которому я применил drop_duplicates, чтобы определить изменение состояния элемента. Данные приведены ниже. Моя цель - установить sh старение на Идентификатор предмета. (примечание Дата создания одинакова для всех записей для указанного c Идентификатор элемента). Я отредактировал это, чтобы показать, что я пробовал, и результат, который я получаю.

    Item Id      State  Created Date     Date         Severity
0    327863        New   2019-02-11    2019-10-03         1
9    327863   Approved   2019-02-11    2019-12-05         1
12   327863  Committed   2019-02-11    2019-12-26         1
16   327863       Done   2019-02-11    2020-01-23         1
27   327864        New   2019-02-11    2019-10-03         1
33   327864  Committed   2019-02-11    2019-11-14         1
42   327864       Done   2019-02-11    2020-01-16         1
53   341283   Approved   2019-03-11    2019-10-03         1
57   341283       Done   2019-03-11    2019-10-31         1

Я делаю следующее, чтобы объединить строки.

s = dfdr.groupby(['Item Id','Created Date', 'Severity']).cumcount()
df1 = dfdr.set_index(['Item Id','Created Date', 'Severity', s]).unstack().sort_index(level=1, axis=1)

df1=df1.reset_index()
print(df1[['Item Id', 'Created Date', 'Severity', 'State','Date']])

вывод смотрит на меня, чтобы показать то, что мне говорят, чтобы избежать цепной индексации.

       Item Id            Created Date   Severity      State                                   Date
                                                           0          1          2     3          0          1          2          3
0       194795 2018-09-18 16:11:25.330        3.0        New   Approved  Committed  Done 2019-10-03 2019-10-10 2019-10-17 2019-10-24
1       194808 2018-09-18 16:11:25.330        3.0  Duplicate        NaN        NaN   NaN 2019-10-03        NaT        NaT        NaT
2       270787 2018-11-27 15:55:02.207        1.0        New  Duplicate        NaN   NaN 2019-10-03 2019-10-10        NaT        NaT

Чтобы использовать данные в графике, я считаю, что мне нужны не вложенные данные, а что-то вроде следующего, но не уверен, как туда добраться.

Item Id    Created Date   Severity   New   NewDate      Approved      AppDate   Committed   CommDate   Done   Done Date
123456     3/25/2020         3       New   2019-10-03   Approved   2019-11-05         NaN        NaT   Done  2020-02-17

После добавления pivot_table и reset_index для ответа Sikan, я ближе, но не получаю тот же вывод. Это вывод, который я получаю.

State                                             Approved  Committed       Done  Duplicate        New
Item Id      Created Date            Severity                                                       
194795       2018-09-18              3.0        2019-10-10 2019-10-17 2019-10-24        NaT 2019-10-03
194808       2018-09-18              3.0               NaT        NaT        NaT 2019-10-03        NaT

Это конкретно мой код сейчас

df = pd.read_excel(r'C:\Users\xxx\Documents\Excel\DataSample.xlsx')
df = df.drop_duplicates(subset=['Item Id', 'State','Created Date'], keep='first')
df['Severity'] = df['Severity'].replace(np.nan,3)
df = pd.pivot_table(df, index=['Item Id', 'Created Date', 'Severity'], columns=['State'], values='Date', aggfunc=lambda x: x)
df.reset_index()
print(df)

Это вывод

State                                     Approved  Committed       Done  Duplicate        New
Item Id      Created Date    Severity                                                       
194795       2018-09-18      3.0        2019-10-10 2019-10-17 2019-10-24        NaT 2019-10-03     
194808       2018-09-18      3.0               NaT        NaT        NaT 2019-10-03        NaT
270787       2018-11-27      1.0               NaT        NaT        NaT 2019-10-10 2019-10-03

Спасибо

1 Ответ

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

Для этого вы можете использовать pd.pivot_table:

df = pd.pivot_table(dfdr, index=['Item Id', 'Created Date', 'Severity'], columns=['State'], values='Date', aggfunc=lambda x: x)
df = df.reset_index()

Вывод:

    ItemId  CreatedDate     Severity    Approved    Committed   Done        New
0   327863  2019-02-11      1           2019-12-05  2019-12-26  2020-01-23  2019-10-03
1   327864  2019-02-11      1           NaN         2019-11-14  2020-01-16  2019-10-03
2   341283  2019-03-11      1           2019-10-03  NaN         2019-10-31  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...