【问题标题】: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 和 lists:

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 和 lists 列失败了?

【问题讨论】:

    标签: python list pandas merge multiple-columns


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多