合并列表列失败

时间:2018-03-22 10:14:23

标签: python list pandas merge multiple-columns

样品:

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

但为什么mergelist失败了?

2 个答案:

答案 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

这就是为什么无法将列与列表合并。没有哈希值。