样品:
df1 = pd.DataFrame({'a':list('ab'), 'b':[[1,2],[4,5]]})
print (df1)
a b
0 a [1, 2]
1 b [4, 5]
df2 = pd.DataFrame({'c':list('cd'), 'b':[[1,7],[4,5]]})
print (df2)
b c
0 [1, 7] c
1 [4, 5] d
我尝试使用b
s:
list
列
df = pd.merge(df1, df2, on='b')
TypeError:*之后的类型对象参数必须是序列,而不是映射
我找到了将转换列转换为元组的解决方案:
df1['b'] = df1['b'].apply(tuple)
df2['b'] = df2['b'].apply(tuple)
df = pd.merge(df1, df2, on='b')
print (df)
a b c
0 b (4, 5) d
但为什么merge
列list
失败了?
答案 0 :(得分:2)
我不确定,但似乎使用dict而不是列表如:
df1 = pd.DataFrame({'a':list('ab'), 'b':[{1:2},{4:5}]})
df2 = pd.DataFrame({'c':list('cd'), 'b':[{1:7},{4:5}]})
或设置:
df1 = pd.DataFrame({'a':list('ab'), 'b':[{1,2},{4,5}]})
df2 = pd.DataFrame({'c':list('cd'), 'b':[{1,7},{4,5}]})
你会得到同样的错误。
因此,我认为与list
列的合并失败,因为它们可变,而tuble
不是
答案 1 :(得分:1)
当我在python3.6中尝试您的示例时
df1 = pd.DataFrame({'a':list('ab'), 'b':[[1,2],[4,5]]})
print (df1)
df2 = pd.DataFrame({'c':list('cd'), 'b':[[1,7],[4,5]]})
print (df2)
df = pd.merge(df1, df2, on='b')
我得到(最终)错误
TypeError: unhashable type: 'list'
由于要合并,因此要合并的列必须是可哈希的。 如果您尝试散列其中一个值,则会给出相同的错误
hash([1,7])
将值转换为元组使其可散列
print(hash((1,7)))
1303117175
这就是为什么无法将列与列表合并。没有哈希值。