我想根据第一个数据框的值合并两个数据框。但是标识符列充满了列表,更糟糕的是,列表中元素的顺序是不可排序的,并且可能与来自第二个数据帧的列表中的元素的顺序不同,即使元素是相同的。所以基本上,我希望第一个数据框包含基于这些不可排序列表的来自第二个数据框的更多信息。
第一个数据帧看起来像这样:
| id | Info |
| -------- | ------------- |
| 1 | ['a','b','c'] |
| 2 | ['a','b'] |
| 3 | ['a','c','b'] |
| 4 | ['c','a'] |
第二个数据帧看起来像这样:
| add_info | Info |
| -------- | ------------- |
| Good | ['a','b','c'] |
| Ok | ['a','b'] |
| Fine | ['a','c'] |
| Bad | ['b','c'] |
那么所需的数据帧将是:
| id | Info | add_info |
| -------- | ------------- |------------- |
| 1 | ['a','b','c'] | Good |
| 2 | ['a','b'] | Ok |
| 3 | ['a','c','b'] | Good |
| 4 | ['c','a'] | Fine |
'info'列是唯一可用的标识符。在第一个数据框中,"info"列的"顺序"非常糟糕。我希望我把意思表达清楚了。最后一个附带说明,"列表"也可以是数组。我只是想加上这一点,以防解决这个问题会更容易/更难。
您可以考虑通过预先排序将它们连接起来:
df1['Info'] = df1['Info'].map(lambda x: str(sorted(x)) if type(x) == list else x)
df2['Info'] = df2['Info'].map(lambda x: str(sorted(x)) if type(x) == list else x)
之后你可以安全地使用:
output = df1.merge(df2,how='left',on='Info')
创建预期输出:
id Info add_info
0 1 ['a', 'b', 'c'] Good
1 2 ['a', 'b'] Ok
2 3 ['a', 'b', 'c'] Good
3 4 ['a', 'c'] Fine