Изменить значения столбца условно и повторить несколько раз - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь заменить значения в определенных столбцах в панде.Поскольку нужно внести ряд изменений, я подхожу к этому с помощью цикла for (хотя я не предвосхищен этим как ответом).Я только начинаю с python, поэтому очень извиняюсь, если это очевидно - я не могу найти ничего, что могло бы решить эту проблему.

Скажем, у меня есть такой кадр данных:

import pandas as pd

weather_data = [["unknown", "rainy"], ["unknown", "sun"], ["rainy", "not sunny at all"], ["stormy", "a lot of rain"]]
weather = pd.DataFrame(weather_data, columns = ["weather", "weather_note"])

Если данные о погоде неизвестны, я хочу использовать текст из примечаний для заполнения данных.Например, если он говорит «дождь», тогда я хочу, чтобы значение погоды было «дождливым», предполагая, что оно ранее было неизвестно.

Я пробовал это:

weather_text = ["rain", "sun"]
weather_label = ["rainy", "sunny"]

for i in range(len(weather_text)):
    weather.loc[weather['weather_note'].str.contains(weather_text[i], na = False) & 
               weather['weather'].str.contains("unknown")] = weather_label[i]

Это меняет каждое значение в строке, которое соответствует условию, на любое значение в weather_label.Я понимаю, почему это происходит, но я не уверен, как изменить только соответствующий столбец.Я пробовал это:

for i in range(len(weather_text)):
    weather.loc[weather['weather_note'].str.contains(weather_text[i], na = False) & 
               weather['weather']str.contains("unknown")]
    weather['weather'] = weather_label[i]

Но затем значение меняется на последнее значение в списке weather_label, а не на то же индексное положение.

В моих реальных данных гораздо больше комбинаций шаблонов и значений, поэтому я не хочу запускать каждую комбинацию по отдельности.

Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Вот как бы я это сделал. Я использовал NumPy в этом коде ... надеюсь, что все в порядке. Мне просто очень нравится метод векторизации numpy. У Панд есть эквивалент, но я не склонен его использовать. Метод векторизации (показанный в последней строке кода) предназначен для таких ситуаций, когда вы хотите * что-то сделать с целым столбцом, но он делает это без необходимости указывать цикл в коде (он выполняет цикл за кадром для вас).

import pandas as pd
import numpy as np

weather_data = [["unknown", "rainy"], ["unknown", "sun"], ["rainy", "not sunny at all"], ["stormy", "a lot of rain"]]
weather = pd.DataFrame(weather_data, columns = ["weather", "weather_note"])

weather_indicators = {'rain': 'rainy',
                      'drizzle': 'rainy',
                      'sun': 'sunny',
                      'bright': 'sunny',
                      # add each pattern to this dictionary
                      }

def determine_weather(weather, weather_note):
    output = weather
    if weather == 'unknown':
        for indicator in weather_indicators:
            if indicator in weather_note:
                output = weather_indicators[indicator]
    return output


weather['weather'] = np.vectorize(determine_weather)(weather['weather'], weather['weather_note'])

Я использую объект словаря с именем weather_indicators для хранения шаблонов. Вы можете добавить больше шаблонов к нему. Если количество шаблонов очень велико (например, сотен), то, возможно, рассмотрите возможность их хранения в каком-либо другом объекте, таком как таблица базы данных или CSV-файл или что-то еще, и затем считывание этого в код. В этот момент вам, очевидно, придется переделать приведенный выше код, поскольку это выходит за рамки вашего вопроса.

Но в основном я создаю функцию, которая ищет определенное индикаторное слово (например, «дождь»), и если слово находится в значении weather_note, тогда я устанавливаю столбец weather в качестве указанного значения из weather_indicator словарь объекта. Затем примените функцию к столбцу weather фрейма данных, используя функцию векторизации numpy.

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

Назначьте значение из weather_note, если значение в погоде 'неизвестно'.Замените слова как солнце на солнечный с помощью df.replace.

weather.loc[weather['weather'] == 'unknown', 'weather'] = weather['weather_note']
weather['weather'].replace('sun', 'sunny', inplace = True)

    weather weather_note
0   rainy   rainy
1   sunny   sun
2   rainy   not sunny at all
3   stormy  a lot of rain
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...