Панды Python: Добавьте значение столбца на основе другого такого же значения столбца

#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'])