熊猫-仅部分合并一个数据框

时间:2020-01-17 09:43:44

标签: python pandas dataframe merge

这是以下问题的后续问题: Pandas Similarity Matching

第一个问题的最终目标是找到一种方法,以使相似的CountryId匹配每一行。

这是示例数据框:

 df = pd.DataFrame([[1, 5, 'AADDEEEEIILMNORRTU'], [2, 5, 'AACEEEEGMMNNTT'], [3, 5, 'AAACCCCEFHIILMNNOPRRRSSTTUUY'], [4, 5, 'DEEEGINOOPRRSTY'], [5, 5, 'AACCDEEHHIIKMNNNNTTW'], [6, 5, 'ACEEHHIKMMNSSTUV'], [7, 5, 'ACELMNOOPPRRTU'], [8, 5, 'BIT'], [9, 5, 'APR'], [10, 5, 'CDEEEGHILLLNOOST'], [11, 5, 'ACCMNO'], [12, 5, 'AIK'], [13, 5, 'CCHHLLOORSSSTTUZ'], [14, 5, 'ANNOSXY'], [15, 5, 'AABBCEEEEHIILMNNOPRRRSSTUUVY']],columns=['PartnerId','CountryId','Name'])

在其他线程中回答对这个问题很有用,但是我最终遇到了计算问题。我的真实来源包含19.000行,并且将来还会更大。

答案是建议merge每个数据帧与每个自我进行比较,以与具有相同CountryId的其他所有行进行比较:

df = df.merge(df, on='CountryId', how='outer')  

即使是上面提供的15行的小例子,我们最终也会合并225行。对于整个数据集,我最终获得131.044.638行,这使我的RAM不能正常工作。因此,我需要考虑一种merge两个数据框的更好方法。

在进行相似性检查时,我想知道是否有可能:

  1. 根据CountryIdName

  2. 对数据帧进行排序
  3. 仅合并每行与+/- 3行连接。例如。排序后,第1行将仅与(2,3&4)合并,因为这是第一个 行。,第2行将仅与(1、3、4、5)合并,依此类推。

像这样,我几乎彼此有相似的名字,而“更远”的名字也不会相似。因此,无需检查它们的相似性。

1 个答案:

答案 0 :(得分:0)

我找到了解决该问题的方法,该方法是在(如果存在的话)之前和之后进行3行。

sorted_df = df.sort_values(by=['CountryId','Name']).reset_index(drop=True)
new_sorted = pd.Series()
min = -3
max = 3
for s in list(range(min,max+1,1)):
    if s == min:
        new_sorted = sorted_df['PartnerId'].astype(str).shift(s,fill_value='A').rename('MatchingID')
    elif s != 0:
        new_sorted = new_sorted + '-' + sorted_df['PartnerId'].astype(str).shift(s,fill_value='A').rename('MatchingID')


match = sorted_df.merge(new_sorted,left_index=True,right_index=True)

matching_df = []
for index, row in match.iterrows():
    row_values = row.tolist()
    matching_df += [row_values[0:-1] + [int(w)] for w in row_values[-1].split('-') if w != 'A']

如果有人能提出更好的主意,我将很高兴听到它!