TypeError: unhashable тип: 'list' pandas python - PullRequest
0 голосов
/ 25 января 2020

df - база данных с погодой в виде столбца

 Weather
 Rain, freezing cold
 Rain, and thunder
 Thunderstorm, and dust
 Drizzle, for half an hour
 Drizzle, for sometime
 Rain, non stop
 Slight rain

Код

heavy_rain_indicator = ['Rain,','Thunderstorm,',]
light_rain_indicator = ['Drizzle,','Slight rain']

df['Heavy Rain Indicator'] = (df['Weather'].str.contains(heavy_rain_indicator))
df['Light Rain Indicator'] = (df['Weather'].str.contains(light_rain_indicator))

Ожидаемый результат:

 Weather                  Heavy Rain Indicator    Light Rain Indicator
 Rain, freezing cold         TRUE                      FALSE
 Rain, and thunder           TRUE                      FALSE
 Thunderstorm, and dust       TRUE                      FALSE
 Drizzle, for half an hour   FALSE                     TRUE
 Drizzle, for sometime       FALSE                     TRUE
 Rain, non stop              TRUE                      FALSE
 Slight rain                 FALSE                     TRUE

Фактический результат

 TypeError: unhashable type: 'list'
 ----> 4     df['Heavy Rain Indicator'] = (df['Weather'].str.contains(heavy_rain_indicator))

Я хочу, чтобы столбцы индикатора сильного дождя были TRUE, когда присутствуют индикаторы сильного дождя и индикатор слабого дождя быть TRUE при наличии индикаторов небольшого дождя

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

Ответы [ 3 ]

2 голосов
/ 25 января 2020

Вы можете попробовать это:

def get_TF(x, info_list):
    return any([True for i in info_list if i in x])
heavy_rain_indicator = ['Rain,','Thunderstorm,']
light_rain_indicator = ['Drizzle,','Slight rain']

df['Heavy Rain Indicator'] = df['Weather'].apply(lambda x : get_TF(x, heavy_rain_indicator))
df['Light Rain Indicator'] = df['Weather'].apply(lambda x : get_TF(x, light_rain_indicator))
df


                     Weather  Heavy Rain Indicator  Light Rain Indicator
0        Rain, freezing cold                  True                 False
1          Rain, and thunder                  True                 False
2     Thunderstorm, and dust                  True                 False
3  Drizzle, for half an hour                 False                  True
4      Drizzle, for sometime                 False                  True
5             Rain, non stop                  True                 False
6                Slight rain                 False                  True

2 голосов
/ 25 января 2020

Подробнее pandas ответ:

df['Heavy Rain Indicator'] = df['Weather'].str.startswith(tuple(heavy_rain_indicator))
df['Light Rain Indicator'] = df['Weather'].str.startswith(tuple(light_rain_indicator))

или, если хотите, найдите случаи не только с самого начала:

df['Heavy Rain Indicator'] = df['Weather'].str.contains('|'.join(heavy_rain_indicator))
df['Light Rain Indicator'] = df['Weather'].str.contains('|'.join(light_rain_indicator))
2 голосов
/ 25 января 2020

str.contains принимает аргумент как string, но вы передаете список

Вы можете использовать list comprehension с any, как показано ниже:

df['Heavy Rain Indicator'] = [any(i.lower() in j.lower() for i in heavy_rain_indicator) for j in df["Weather"].values]

df['Light Rain Indicator'] = [any(i.lower() in j.lower() for i in light_rain_indicator) for j in df["Weather"].values]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...