当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError

Posted

技术标签:

【中文标题】当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError【英文标题】:TypeError from merge pandas DataFrame on columns when item in columns is list 【发布时间】:2018-08-31 16:13:20 【问题描述】:

我得到TypeError: type object argument after * must be an iterable, not itertools.imap 用于在数据列表的列'allmzidx' 上执行pd.merge 2 个数据帧df1df_iden

简化数据:

# df1
df1 = pd.DataFrame('a':[1110],'b':[1135],'c':[1160])
df1['allmzidx'] = df1.values.tolist()
df1['allmzidx'] = df1.allmzidx.sort_values()

# df_iden is created from list of lists of tuples
alliden_tuple2 = [[('a2','b2',[1736, 1761, 1786]),('a12','b12',[1110, 1135, 1160])],[('a2','b2',[1736, 1761, 1786]  ),('a12','b12',[1110, 1135, 1160])]]
# for each list of tuples
for index, each_iden in enumerate(alliden_tuple2):
    df_iden = pd.DataFrame(each_iden, columns=['int','mztop3','allmzidx'])
    df_iden = pd.merge(df_iden, df1, how='left', on='allmzidx')

为什么我不能在这里将“allmzidx”上的数据框合并为list

更新将数据更改为元组有效,但如果有人可以添加 list 不起作用的其他原因,我将不胜感激

【问题讨论】:

【参考方案1】:

我认为需要将lists 转换为tuples:

df1['allmzidx'] = df1['allmzidx'].apply(tuple)

for index, each_iden in enumerate(alliden_tuple2):
    df_iden = pd.DataFrame(each_iden, columns=['int','mztop3','allmzidx'])
    df_iden['allmzidx'] = df_iden['allmzidx'].apply(tuple)
    df_iden = pd.merge(df_iden, df1, how='left', on='allmzidx')

【讨论】:

它有效,谢谢。但是为什么我必须将它们都更改为tuple?我尝试将它们合并到list 很长时间。为什么list 在这种情况下不起作用? @Jan - 嗯,我不是 pandas 开发人员,但可能是因为列表是可变的,而元组不是。或者更简单,它没有实现。 @Jan - 我尝试询问有关原因的问题,我希望熊猫开发人员能解释一下。检查here

以上是关于当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

合并 Pandas 列中的列表,其中列名在列表中

熊猫数据框列上的子字符串

Pandas 将多个数据帧与存储在多个列上的查找值合并

当列数据类型为列表时如何过滤熊猫数据框

Pandas:如何通过保留第一个数据框的信息来合并列上的两个数据框?

熊猫合并:合并同一列上的两个数据框,但保留不同的列