TypeError:无法散列的类型:'list'pandas python

时间:2020-01-25 14:52:59

标签: python string pandas list

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(然后删除帖子),但是我无法键入确切的表达式,因此对于大雨指标,例如,我希望所有以Rain开头的值都在大指标列中,因此上。请相应地回答

3 个答案:

答案 0 :(得分:2)

df %>% mutate(hrzn = factor(hrzn)) %>% group_by(hrzn) %>% summarise(centile_10 = parameter[which(cumsum(density) > .1^.2)[1]], centile_90 = parameter[which(cumsum(density) > .9^.2)[1]] ) #> # A tibble: 5 x 3 #> hrzn centile_10 centile_90 #> <fct> <dbl> <dbl> #> 1 1 0.0545 0.664 #> 2 2 0.0545 0.664 #> 3 3 0.0545 0.664 #> 4 4 0.0545 0.664 #> 5 5 0.0545 0.664 将参数设为str.contains,但您正在传递列表

您可以将stringlist comprehension一起使用,如下所示:

any

答案 1 :(得分:2)

您可以尝试以下操作:

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 :(得分:2)

更多熊猫回答:

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))