2016-11-11 6 views
1

アイテムの在庫を表す2つのパンダのデータフレームがあります。私はこれらの両方を関連付けるしたいと思い、私はこれらの在庫が同じオブジェクトを表す可能性があることを知っている2つのパンダのデータフレームを1つにまとめ、複数の列の並べ替え

df1 
id, item, colour, year 
1, car, red, 2015 
2, truck,, 2016 
3, house, blue, 
4, car, blue, 
5, truck, red, 2015 

df2 
id, item, colour, year 
1, house, blue, 2015 
2, truck,, 2015 
3, car, blue, 
4, house,, 
5, car, red, 2015 

:両方のデータフレームは、4つの列を持っています。

例えば

  • DF1 [1] = DF2 [5](3つのidentique変数)
  • DF1 [4] = DF2 [3](2つのidentique変数)
  • DF1 [3 ](家、青)はおそらくdf2 [1](家、青、2015)と同じです。

私は2つの主な問題があります:それを効率的に行う方法と、リンクに信頼性を与える方法です。

私はすべての列[item、color、year]を組み合わせてこれにマージする共通のフィールドを作成することを考えました。私は上記の2つの最初の試合を手に入れるだろう。彼らは同じ信頼性を持っていません。私はこの信頼性を「得点する」簡単な方法があるのだろうかと思います。(現時点では、可変の可用性に応じて2つのマージを行うことを考えています。 私は2つの変数(item、color)だけを持つ別の共通フィールドを作成し、これをマージします。それは私にリンクを与えるだろう:(家、青、)と(家、青、2015)。これは明らかに弱いリンクになるでしょう。

順番にマージせずにこれを行うにはどうすればよいですか?私の現在の計画は、3つの属性(存在する場合)、2つの属性(3つの順列)、残りの属性に少なくとも2つの属性、次に1つのみをマージすることです。私はマージに使用した属性の数に基づいてリンクに信頼性スコアを与えます。

答えて

0
df = pd.DataFrame(
    (df1.values[:, None] == df2.values).sum(2), 
    df1.index, df2.index) 

matches = df.mask(df.lt(2)).stack() 

def f(df): 
    i, j = df.name 
    return pd.concat([df1.loc[i], df2.loc[i]], axis=1, keys=['df1', 'df2']).T 

matches.groupby(level=[0, 1]).apply(f).stack().unstack([-2, -1]) 

enter image description here

+0

うわー、それはクールに見えます!私はすべてを理解しているかどうかはわかりません(df1をdf2のすぐ隣に置くので最初は混乱しましたが、実際は結果のIDです) 正確な一致として年を持つことは可能ですか? (基本的に2は2と同じではありません) –

関連する問題