#python #pandas #dataframe
#питон #панды #фрейм данных
Вопрос:
У меня есть фрейм данных панд, подобный этому.
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 NaN Test 3 C1 C1-T1 2 NaN Test 5- C2 C2-T0 3 NaN Test 5- C2 C2-T1 4 2021-12-01 10:01:46.452 NaN NaN NaN NaN
Я хочу добавить значение города, которое основано на том, что строки имеют один и тот же источник, уровень и значение округа.
Я пробовал isin, groupby, diff(но моя ценность-str), но все еще не понял.
Изображение ниже-это то, что я хочу получить.
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 NaN Test 3 C1 C1-T0 2 NaN Test 5- C2 C2-T0, C2-T1 3 2021-12-01 10:01:46.452 NaN NaN NaN NaN
Очень ценю вашу помощь!
Ответ №1:
Чтобы это сработало , мы можем создать из него список с помощью groupby()
и apply(list)
, затем мы можем преобразовать его в строку, разделенную запятой. Давайте разделим его на 2 шага для лучшего понимания.
Лично я бы сохранил эти данные в виде списка в серии pandas и не выполнял шаг 2. Форматирование в виде строки, разделенной запятой, может быть не идеальным для работы.
Шаг 1:
output = df.groupby(['Time','Source','Level','County'])['Town'].apply(list).reset_index()
ВОЗВРАТ:
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN [nan] 1 2021-12-01 10:01:46.452 NaN NaN NaN [nan] 2 NaN Test 3 C1 [C1-T1] 3 NaN Test 5- C2 [C2-T0, C2-T1]
Теперь мы можем правильно отформатировать их в строки (шаг 2):
output['Town'] = pd.Series([', '.join([y for y in x if type(y) == str]) for x in output['Town']]).replace('',np.nan)
Что приводит к желаемому результату:
Time Source Level County Town 0 2021-12-01 10:01:41.443 NaN NaN NaN NaN 1 2021-12-01 10:01:46.452 NaN NaN NaN NaN 2 NaN Test 3 C1 C1-T1 3 NaN Test 5- C2 C2-T0, C2-T1
Комментарии:
1. Хорошо, я понимаю. Я попробую это сделать. Но я думаю, что мне не нужно все время собираться, верно? Потому что строка 1-3 совпадает со строкой 0, и я хочу, чтобы значение времени исчезло(появилось только в первой строке).
2. Вам нужно использовать
Time
, если вы хотите получить ожидаемый результат, в противном случае у вас будет 3 строки в качестве вывода, а не 4. Но не стесняйтесь изменять код в соответствии с вашими целями.3. Рад помочь! Если у вас есть какие-либо вопросы, дайте мне знать 🙂 Также не стесняйтесь принимать ответ с галочкой слева. Это отметит ваш вопрос как решенный и вознаградит вас тоже некоторым счетом!
4. Я использую groupby с «Временем», но он вернул пустой фрейм данных. Кроме того, мне нужна сортировка фреймов данных, например, исходные заказы… Какие-нибудь советы? Спасибо!
5. Хм, я не слишком уверен в первом вопросе. Для сортировки фрейма данных вы можете использовать
.sort_values(by=['Column 1','Column 2'])