【问题标题】:TypeError: unhashable type: 'list' pandas pythonTypeError: unhashable type: 'list' pandas python
【发布时间】:2020-05-11 14:27:09
【问题描述】:

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 开头的值,都在重型指示器列中等等。请相应回答

【问题讨论】:

标签: python string pandas list


【解决方案1】:

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]

【讨论】:

  • 你为什么使用.values?这应该不是一个大问题,但是执行不区分大小写比较的正确方法是使用str.casefold()。
【解决方案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

【讨论】:

  • 你真的不需要.apply()、一个完整的函数和一个lambda。为什么使用any([True for i in info_list if i in x]) 而不仅仅是any(i in x for i in info_list)?
【解决方案3】:

更多熊猫回答:

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

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 2022-12-05
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2020-03-27
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多