Python 将唯一值从一个数据帧映射到另一个数据帧的最快方法是什么?
我试图根据Python 将唯一值从一个数据帧映射到另一个数据帧的最快方法是什么?,python,pandas,function,mapping,apply,Python,Pandas,Function,Mapping,Apply,我试图根据match_df列中列表中的值,将一个数据帧(df1)中的列中的唯一值映射到另一个(match_df)中的新列 数据: df1有1000万行和列:['ID','match1','match2'] match_df有10000行,是分组在“match1”上的数据帧,用于提供“match2”和“id”的唯一值和计数。它有以下列:['match1'、'match2\u unique'、'match2\u count'、'ID\u unique'、'ID\u count'] 我想在一个
match_df
列中列表中的值,将一个数据帧(df1
)中的列中的唯一值映射到另一个(match_df
)中的新列
数据:
有1000万行和列:df1
['ID','match1','match2']
有10000行,是分组在“match1”上的数据帧,用于提供“match2”和“id”的唯一值和计数。它有以下列:match_df
['match1'、'match2\u unique'、'match2\u count'、'ID\u unique'、'ID\u count']
match_df['match2_ids']
中为链接到df1
中的'match2'的所有ID创建一个列表
下面的代码执行此任务,但需要一个多小时才能运行,match_df
是600万行数据帧的子集。最终,我希望能够在600万美元的基础上执行该功能,但计算能力目前还不允许
def map_IDs(x):
return list(df1[df1['match2'].isin(list(x))].ID.unique())
match_df['match2_ids'] = match_df['match2'].apply(lambda x: map_IDs(x))
任何帮助都将不胜感激
编辑:添加了示例
example = {
'ID': [1,2,3,4,5,6,7,8,9,10],
'match1': ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'a', 'a', 'd'],
'match2': ['a1', 'a2', 'b1', 'b1', 'c1', 'c1', 'c1', 'a1', 'a1', 'a1']
}
df1 = pd.DataFrame(example)
match_df = df1.groupby(['match1']).agg({
'match2': ['unique', 'nunique'],
'ID': ['unique', 'count']
}).reset_index()
match_df.columns = match_df.columns.map(''.join)
中间分组数据帧:
|match1|match2unique|match2nunique|IDunique |IDcount|
|:-----|:-----------|:-----------:|:-----------|:-----:|
| 'a' |['a1', 'a2']| 2 |[1, 2, 8, 9]| 4 |
| 'b' |['b1'] | 1 |[3, 4] | 2 |
| 'c' |['c1'] | 1 |[5, 6, 7] | 3 |
| 'd' |['a1'] | 1 |[10] | 1 |
映射功能:
match_df_final['match2_IDs'] = match_df.match2unique.apply(lambda x:
list(df1[df1['match2'].isin(list(x))].ID.unique())
)
最终解决方案:
|match1|match2unique|match2nunique|IDunique |IDcount|match2_IDs |
|:-----|:-----------|:-----------:|:-----------|:-----:|:--------------:|
| 'a' |['a1', 'a2']| 2 |[1, 2, 8, 9]| 4 |[1, 2, 8, 9, 10]|
| 'b' |['b1'] | 1 |[3, 4] | 2 |[3, 4] |
| 'c' |['c1'] | 1 |[5, 6, 7] | 3 |[5, 6, 7] |
| 'd' |['a1'] | 1 |[10] | 1 |[1, 8, 9, 10] |
你的问题有点不清楚——你能提供一个小的、可重复的数据示例吗?另外,我不确定您更广泛的目标是什么,但似乎
merge
将是一个更好的解决方案(在pandas中构建列表列通常是以次优方式使用数据结构的标志)。@C.Braun,感谢您的回复。我添加了一些虚拟数据来显示我正在尝试做什么。我意识到在一列中保存一个列表并不理想,但这应该是一个快速的练习来比较一种匹配模式与另一种匹配模式的效果。我曾考虑过使用df.groupby(['match1','match2']).agg(…)
,但我认为这会使比较统计变得复杂。你的问题有点不清楚-你能提供一个小的、可复制的数据示例吗?另外,我不确定您更广泛的目标是什么,但似乎merge
将是一个更好的解决方案(在pandas中构建列表列通常是以次优方式使用数据结构的标志)。@C.Braun,感谢您的回复。我添加了一些虚拟数据来显示我正在尝试做什么。我意识到在一列中保存一个列表并不理想,但这应该是一个快速的练习来比较一种匹配模式与另一种匹配模式的效果。我曾考虑过使用df.groupby(['match1','match2']).agg(…)
,但我认为这会使比较统计数据变得复杂。