合并列表列失败

Posted

技术标签:

【中文标题】合并列表列失败【英文标题】:Merge list column fail 【发布时间】:2018-08-31 17:31:21 【问题描述】:

示例:

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

我尝试按列合并 blists:

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

但是为什么 mergelists 列失败了?

【问题讨论】:

【参考方案1】:

我不确定,但似乎使用字典而不是列表,例如:

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 不是

【讨论】:

感谢您的回答,您认为这是按设计吗? @jezrael 将整个 df 转换为小写的有效方法是什么? @pyd - 没那么容易,所有列都是字符串? df = df.stack().str.lower().unstack() 应该可以工作。【参考方案2】:

当我在 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

这就是无法将列与列表合并的原因。没有哈希。

【讨论】:

以上是关于合并列表列失败的主要内容,如果未能解决你的问题,请参考以下文章

当列具有空值[重复]时,数据集到列表弹出失败

Vue2 Element description组件 列合并

在 Woocommerce 订单管理列表中显示用户失败并取消订单计数

断言失败:闯入调试器

散列表链地址法查找成功的平均查找长度怎么计算

清单合并失败,使用工具:overrideLibrary