根据差异过滤数据帧有两个系列,一个通过字典映射
Posted
技术标签:
【中文标题】根据差异过滤数据帧有两个系列,一个通过字典映射【英文标题】:Filter dataframe based on difference been two series, one mapped via dictionary 【发布时间】:2019-04-16 11:51:10 【问题描述】:我有我的字典
d = 'A':1, 'B':2, 'C':3
和我的数据框
df =pd.DataFrame(
"col1": ["A", "B", "C"],
"col2": [1, 2, 3],
"col3": [2, 1, 4] )
我搜索将 df 中的每个值与字典中的对应值进行比较。如果匹配,则保留该值,否则丢弃该值。
我试试
m = df['col2'] >= d[df['col1']]
df.where(m, df, other = "")
但它得到了 m 的错误代码:TypeError: 'Series' objects are mutable, 因此它们不能被散列......
感谢您的帮助。
【问题讨论】:
发布你的错误 TypeError: 'Series' 对象是可变的,因此它们不能被散列 是的。应用应该解决这个问题 "Series objects are mutable and cannot be hashed" error的可能重复 【参考方案1】:使用 apply 创建一个新列进行比较
df[‘dict_col’] = df[‘col1’].apply(lambda k: d[k])
m = df[‘dict_col’] >= df[‘col2’]
df[‘col2’] = df[‘col2’].where(m, df, other = "")
【讨论】:
谢谢!但是整行都被删除了,而不仅仅是值。 已更新以将这些值替换为“”【参考方案2】:您可以将pd.Series.map
与loc
和布尔索引一起使用:
df = df.loc[df['col2'] >= df['col1'].map(d)]
【讨论】:
但是整行都被删除了,而不仅仅是值。 @Billy,不,这意味着要么数据错误,要么您应用的逻辑不正确。 我不明白【参考方案3】:提示存在于错误消息本身中。
TypeError: 'Series' 对象是可变的,因此它们不能被散列。
df['col1']
是一个Series
对象,它是一个可变对象。
可变对象不能被散列,因此不能用作字典键。来自docs:
... 字典由键索引,可以是任何不可变类型;字符串和数字总是可以作为键...
您正在使用Series
对象作为字典键。 一种重写d[df['col1']]
的方法是:
[d[x] for x in df['col1']]
【讨论】:
谢谢,很明显,我已经理解了我的错误(并重新阅读了文档)。但是我的条件的结果仍然适用于整行。我不明白为什么。以上是关于根据差异过滤数据帧有两个系列,一个通过字典映射的主要内容,如果未能解决你的问题,请参考以下文章
从两个熊猫系列(csv的列作为DataFrame)创建元素字典