web-dev-qa-db-ja.com

マージ関数で検証pandas

今日、私はパンダの「マージ」機能をもう少し深く掘り下げようとしていましたが、ドキュメントで報告されているように、「検証」オプションが見つかりました。

検証:文字列、デフォルトなし

指定されている場合、マージが指定されたタイプであるかどうかを確認します。

「one_to_one」または「1:1」:マージキーが左右のデータセットの両方で一意であるかどうかを確認します。 「one_to_many」または「1:m」:マージキーが左側のデータセットで一意であるかどうかを確認します。 「many_to_one」または「m:1」:マージキーが正しいデータセットで一意であるかどうかを確認します。 「many_to_many」または「m:m」:許可されますが、チェックは行われません。

この関数をどこでどのように使用するかについての実用的な例を探し回っていましたが、見つかりませんでした。さらに、マージしていたDataFrameのグループに適用しようとしても、出力が変更されていないようです。誰かが私にそれをよりよく理解させるための実用的な例を教えてもらえますか?

前もって感謝します、

マティア

7
iraciv94

新しいvaldateパラメータは、検証が失敗した場合にMergeErrorを発生させます。例:

df1 = pd.DataFrame({'a':list('aabc'),'b':np.random.randn(4)})
df2 = pd.DataFrame({'a':list('aabc'),'b':np.random.randn(4)})

print(df1)
print(df2)

   a         b
0  a -2.557152
1  a -0.145969
2  b -1.629560
3  c -0.233517

   a         b
0  a -0.352038
1  a  0.490438
2  b  0.319452
3  c -0.599481

ここで、列'a'validateなしでマージすると:

In[39]:
df1.merge(df2, on='a')

Out[39]: 
   a       b_x       b_y
0  a -2.557152 -0.352038
1  a -2.557152  0.490438
2  a -0.145969 -0.352038
3  a -0.145969  0.490438
4  b -1.629560  0.319452
5  c -0.233517 -0.599481

これは機能しますが、列「b」が異なるため、「a」の行が増えます。validate='1:1'を渡すと、エラーが発生します。

MergeError: Merge keys are not unique in either left or right dataset; not a one-to-one merge

validate='1:m'を渡すと、別のエラーが発生します。

MergeError: Merge keys are not unique in left dataset;not a one-to-many merge

'm:m'を渡すと、これも検証に失敗します。

In[42]:
df1.merge(df2, on='a',validate='m:m')

Out[42]: 
   a       b_x       b_y
0  a -2.557152 -0.352038
1  a -2.557152  0.490438
2  a -0.145969 -0.352038
3  a -0.145969  0.490438
4  b -1.629560  0.319452
5  c -0.233517 -0.599481

エラーは発生せず、validate paramを渡さなかった場合、同じマージされたdfを取得します

APIドキュメントには例が示されていませんが、 新機能 セクションには例があり、元の github拡張機能 にも背景情報が記載されています。