合并列表列失败
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
我尝试按列合并 b
和 list
s:
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
s 列失败了?
【问题讨论】:
【参考方案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组件 列合并