我的工作任务,以获得所有可能的组合(对)的ID的(公司)partipated在一个投标,并创建一个新的 Dataframe 与ID_1,ID_2,匹配参数(投标ID)。
我已经准备了以下两个函数,它们提供了我所需的结果,但是当应用于超过500 k行的df时,执行时间超过了几个小时。
import pandas as pd
from itertools import combinations
def get_pairs(dataframe, items):
return (
(c1, c2, item)
for item in items
for c1, c2 in combinations(dataframe[dataframe['tender_product'] == item]['ID_name'], 2)
)
def get_all_pairs(df):
pairs = get_pairs(df,df['tender_product'])
df= pd.DataFrame(pairs, columns=['ID_name1', 'ID_name2','tender_product'])
df=df.query('ID_name1 != ID_name2')
df=df.drop_duplicates()
df['pair'] = df['ID_name1'].astype(str)+'_'+df['ID_name2'].astype(str)
df['reversed_pair'] =df['ID_name1'].astype(str)+'_'+df['ID_name2'].astype(str)
return df
有哪些选项可以优化代码,使其在相同的结果下工作得更快?
初始数据样本:
| ID|嫩产品|
| --|--|
| 1 |招标_1|
| 2 |招标_1|
| 3 |招标_2|
| 4 |招标_2|
电流输出样本:
| ID1| ID2|嫩产品|对|反向线对|
| --|--|--|--|--|
| 1 | 2 |招标_1| 1_2|第二个_1|
| 3 | 4 |招标_2| 3_4| 4_3|
2条答案
按热度按时间nqwrtyyt1#
我不确定这会有多高效(我没有500 K行来测试!):))但这应该做你想要的吗?
注意:这里的顺序很重要。如果我们先替换ID 1值,则该单元格中保存的列表将不再存在,因为我们已经替换了它
最后,我们在两个新列中创建ID的组合
在Jupyter中测试:
wpcxdonn2#
谢谢你的回答!首先,我明白所使用的项目不是最佳的,改为.unique()。进一步应用group.by()如下