Python 使用列表值在列上左连接

Python 使用列表值在列上左连接,python,pandas,Python,Pandas,给出这两个数据示例,我想通过一列进行连接,在左侧的连接数据框中,值是一个由多个元素组成的列表,在另一个数据框中,值是相同的列(主键),具有传统信息,没有列表作为格式 举个例子 df1 = pd.DataFrame({'ID':[[1111],[2222,3333],[4444,5555],[6666]],'NAME':['foo','bar','zoo','bahh']}) df2 = pd.DataFrame({'ID':[[1111],[2222],[3333],[4444],[5555],

给出这两个数据示例,我想通过一列进行连接,在左侧的连接数据框中,值是一个由多个元素组成的列表,在另一个数据框中,值是相同的列(主键),具有传统信息,没有列表作为格式

举个例子

df1 = pd.DataFrame({'ID':[[1111],[2222,3333],[4444,5555],[6666]],'NAME':['foo','bar','zoo','bahh']})
df2 = pd.DataFrame({'ID':[[1111],[2222],[3333],[4444],[5555],[7777]],'ALT_NAME':['foo_alt','bar_alt','zoo_alt','baoo','razz','foo fi']})
    print(df1)
    print(df2)
输出[1]:

    ID              NAME
0   [1111]          foo
1   [2222, 3333]    bar
2   [4444, 5555]    zoo
3   [6666]          bahh
输出[2]:

    ALT_NAME    ID
0   foo_alt     [1111]
1   bar_alt     [2222]
2   wis_alt     [3333]
3   baoo        [4444]
4   razz        [5555]
5   foo fi      [7777]
结果应该是:

    ID              NAME    ALT NAME
0   [1111]          foo     [foo_alt]       
1   [2222, 3333]    bar     [bar_alt , wis_alt]
2   [4444, 5555]    zoo     [baoo, razz]        
3   [6666]          bahh    nan
提议的解决办法:
我可以通过将ID拆分成几列并进行几个左连接来解决这个问题,但我希望找到在线或更智能的解决方案。因此,这个问题的本质更倾向于python学习。

您应该将输出[2]转换为地图(熊猫系列),例如:

完成后,您只需使用“应用”并通过列表获取值:

df1['ALT NAME'] = df1.ID.apply(lambda x: [s2.get(i,None) for i in x])
print(df1)
返回:

             ID  NAME            ALT NAME
0        [1111]   foo           [foo_alt]
1  [2222, 3333]   bar  [bar_alt, zoo_alt]
2  [4444, 5555]   zoo        [baoo, razz]
3        [6666]  bahh              [None]

小注释:这不会给出最后一行的
nan
。但是如果你有一个匹配和一个不匹配,那不是[match1,none]吗

转换为s2后的Df2:

ID
1111    foo_alt
2222    bar_alt
3333    zoo_alt
4444       baoo
5555       razz
7777     foo fi

单行版本:
s2=df2.assign(ID=df2.ID.apply(lambda x:x[0])。set_index('ID')['ALT_NAME']

我只需创建额外的列作为字符串类型并在其上联接

df1['ID_STR'] = df1['ID'].astype(str)
df2['ID_STR'] = df2['ID'].astype(str)

df = pd.merge(df1, df2, how = 'left', on = 'ID_STR')

你做得很好,列表中的None或nonte本身是无关紧要的,None或[None]对我来说意味着:在相应的数据集中没有任何其他可用的名称试图执行它,看起来很慢,但期望有结果。不幸的是,这不是很快。您的帧最初不是最佳的。
df1['ID_STR'] = df1['ID'].astype(str)
df2['ID_STR'] = df2['ID'].astype(str)

df = pd.merge(df1, df2, how = 'left', on = 'ID_STR')