TypeError:不可损坏的类型:“列表”无效

2024-09-27 19:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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(然后删除了帖子),但我无法键入准确的表达式,因此对于eg的大雨指示器,我希望所有以雨开头的值都位于大雨指示器列中,以此类推。请相应地回答


Tags: andfalsetruedffor指示器indicatorweather
3条回答

str.contains将参数作为string但您正在传递列表

您可以将list comprehensionany一起使用,如下所示:

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]

更多熊猫回答:

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

您可以尝试以下方法:

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

相关问题 更多 >

    热门问题