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开头的值都在大指标列中,因此上。请相应地回答
答案 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
,但您正在传递列表
您可以将string
与list 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))