Преобразуйте значения строк в столбцы, чтобы назначить поле даты каждому новому столбцу с помощью панд Python. - PullRequest
1 голос
/ 19 сентября 2019

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

Мой Dataframe выглядит следующим образом.Eventype 1.0 - это моя дата начала для определенного узла сети, а его последовательное значение EventType = 5 - это моя дата окончания.Поэтому я хотел бы преобразовать значения Eventype в столбцы, чтобы узнать дату начала и дату окончания.

EventID NetworkNode EventTime   EventType
1140085 606.0   2018-09-12 14:11:00 1.0
1140416 606.0   2018-09-12 16:39:00 5.0
1141105 606.0   2018-09-12 22:16:00 1.0
1141109 606.0   2018-09-12 22:19:00 5.0
1141288 421.0   2018-09-12 23:21:00 5.0
1141295 508.0   2018-09-12 23:23:00 5.0
1141568 647.0   2018-10-12 01:09:00 1.0
1141578 647.0   2018-10-12 01:12:00 5.0
1142463 461.0   2018-10-12 05:52:00 1.0
1142467 460.0   2018-10-12 05:53:00 1.0
1142468 502.0   2018-10-12 05:54:00 1.0
1142476 502.0   2018-10-12 05:57:00 5.0
1142493 461.0   2018-10-12 06:00:00 5.0
1142516 460.0   2018-10-12 06:01:00 5.0
1145299 629.0   2018-10-12 21:13:00 1.0
1145411 629.0   2018-10-12 22:16:00 5.0
1145414 629.0   2018-10-12 22:23:00 1.0
1145437 629.0   2018-10-12 22:26:00 5.0
1145437 421.0   2018-10-12 22:26:00 5.0


df = df[['EventID','NetworkNode', 'EventTime', 'EventType']].sort_values(by=['EventID'])

df = df.set_index(['NetworkNode','EventType'])['EventTime'].unstack()

Я пробовал этот код, но выдает ошибку,

"ValueError: Indexсодержит повторяющиеся записи, не может изменить форму ", поскольку сетевой узел имеет дубликат.

Мой желаемый результат должен быть примерно таким.

Значение" 1.0 "в столбце EventType представляет дату и время началаэтого события для этого NetworkNode и последующее значение «5.0» для того же NetworkNode будет временем окончания.Поэтому я хотел бы преобразовать эти две строки в одну строку по времени начала и окончания.

NetworkNode   1.0                      5.0
606.0       2018-09-12 14:11:00     2018-09-12 16:39:00
606.0           2018-09-12 22:16:00     2018-09-12 22:19:00
421.0           2018-09-12 23:21:00 2018-10-12 23:26:00
508.0                               2018-09-12 23:23:00
647.0           2018-10-12 01:09:00 2018-10-12 01:12:00
461.0           2018-10-12 05:52:00 2018-10-12 06:00:00
460.0           2018-10-12 05:53:00 2018-10-12 06:01:00
502.0           2018-10-12 05:54:00 2018-10-12 05:57:00
629.0           2018-10-12 21:13:00 2018-10-12 22:16:00
629.0           2018-10-12 22:23:00 2018-10-12 22:26:00

Пожалуйста, сообщите ....

1 Ответ

0 голосов
/ 19 сентября 2019

Пока я могу ответить

Основная проблема заключается в том, что: чтобы сформировать сводную таблицу таким образом, вам требуется уникальный индекс, индекс не может быть дублирован, поэтому здесь у меня есть 2 варианта, которыми я могу поделиться с вами

1) Объедините EventID и NetworkNode вместе, чтобы сделать его уникальным Индексом, и сформируйте сводную таблицу

data = pd.read_csv(path, encoding="ISO-8859-1")
data_cp = data.copy()
data["Node_ID"] = ""
for x in range(len(data)):
    data["Node_ID"][x] = str(data["NetworkNode"][x]) + "_" + str(data["EventID"][x])
data.pivot(index='Node_ID', columns='EventType', values='EventTime')

Результат будет таким при запуске: Index is NodeID

2) Просто выполните Groupby, используя эти 2 ключа -> NetworkNode и EventType (не нужно указывать его как индекс)

data_cp = data.copy()
data_cp.drop(columns=["EventID"], inplace=True)
view = data_cp.groupby(by=['NetworkNode','EventType'])["EventTime"]
view.first()

Groupby by 2 Columns

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