根据差异过滤数据框分为两个系列,一个通过字典映射

时间:2018-11-13 15:40:34

标签: python pandas dictionary dataframe indexing

我有我的字典

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'对象是可变的,因此不能被散列...

谢谢您的帮助。

3 个答案:

答案 0 :(得分: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 = "")

答案 1 :(得分:1)

您可以将pd.Series.maploc和布尔索引一起使用:

df = df.loc[df['col2'] >= df['col1'].map(d)]

答案 2 :(得分:1)

提示错误信息本身中。

  

TypeError:“系列”对象是可变的,因此不能进行散列。

df['col1']是一个Series对象,它是一个可变对象。

可变对象不能被散列,因此不能用作字典键。来自docs

  

... 字典由键索引,键可以是任何不可变的类型;字符串和数字始终可以是键...

您正在使用Series对象作为字典键。 一种重写d[df['col1']]的方法是:

[d[x] for x in df['col1']]