根据差异过滤数据帧有两个系列,一个通过字典映射

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.maploc 和布尔索引一起使用:

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']]

【讨论】:

谢谢,很明显,我已经理解了我的错误(并重新阅读了文档)。但是我的条件的结果仍然适用于整行。我不明白为什么。

以上是关于根据差异过滤数据帧有两个系列,一个通过字典映射的主要内容,如果未能解决你的问题,请参考以下文章

Swift映射嵌套字典以交换外部和内部键

通过两个数组反应映射而不重复

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

字典中的地图列表

如何使用映射或过滤器而不是列表推导过滤特定值的嵌套字典(pythonic 方式)?

网格映射