100万のdf
を持つメインデータを含むrows
があります。メインデータには30個のcolumns
もあります。ここで、df
という別の列をcategory
に追加します。 category
は_df2
_のcolumn
で、約700個のrows
と、columns
の2つのcolumns
と一致する他の2つのdf
を含みます。
_df2
_のindex
とフレーム間で一致するdf
を設定することから始めますが、_df2
_のindex
の一部はdf
に存在しません。
_df2
_の残りの列は、_AUTHOR_NAME
_およびCATEGORY
と呼ばれます。
df
の関連列は_AUTHOR_NAME
_と呼ばれます。
df
の_AUTHOR_NAME
_の一部は_df2
_に存在せず、その逆もあります。
私が望む命令は、index
のdf
が_df2
_のindex
と一致し、title
のdf
が_df2
_のtitle
と一致する場合、category
にdf
を追加し、それ以外の場合はcategory
にNaNを追加します。
サンプルデータ:
_df2
AUTHOR_NAME CATEGORY
Index
Pub1 author1 main
Pub2 author1 main
Pub3 author1 main
Pub1 author2 sub
Pub3 author2 sub
Pub2 author4 sub
df
AUTHOR_NAME ...n amount of other columns
Index
Pub1 author1
Pub2 author1
Pub1 author2
Pub1 author3
Pub2 author4
expected_result
AUTHOR_NAME CATEGORY ...n amount of other columns
Index
Pub1 author1 main
Pub2 author1 main
Pub1 author2 sub
Pub1 author3 NaN
Pub2 author4 sub
_
df2.merge(df,left_index=True,right_index=True,how='left', on=['AUTHOR_NAME'])
を使用すると、df
が想定より3倍大きくなります。
だから、おそらくマージはこれについて間違った方法だと思った。私が本当にやろうとしていることは、_df2
_をルックアップテーブルとして使用し、特定の条件が満たされているかどうかに応じてtype
の値をdf
に返すことです。
_def calculate_category(df2, d):
category_row = df2[(df2["Index"] == d["Index"]) & (df2["AUTHOR_NAME"] == d["AUTHOR_NAME"])]
return str(category_row['CATEGORY'].iat[0])
df.apply(lambda d: calculate_category(df2, d), axis=1)
_
ただし、これによりエラーがスローされます。
_IndexError: ('index out of bounds', u'occurred at index 7614')
_
次のデータフレームdf
およびdf2
df = pd.DataFrame(dict(
AUTHOR_NAME=list('AAABBCCCCDEEFGG'),
title= list('zyxwvutsrqponml')
))
df2 = pd.DataFrame(dict(
AUTHOR_NAME=list('AABCCEGG'),
title =list('zwvtrpml'),
CATEGORY =list('11223344')
))
オプション1merge
df.merge(df2, how='left')
オプション2join
cols = ['AUTHOR_NAME', 'title']
df.join(df2.set_index(cols), on=cols)
両方のオプションyield
アプローチ1:
代わりに concat
を使用し、Index
列とAUTHOR_NAME
列の両方に存在する重複値を削除できます。その後、メンバーシップのチェックに isin
を使用します。
df_concat = pd.concat([df2, df]).reset_index().drop_duplicates(['Index', 'AUTHOR_NAME'])
df_concat.set_index('Index', inplace=True)
df_concat[df_concat.index.isin(df.index)]
注:列Index
は、両方のDF's
のインデックス列として設定されると想定されます。
アプローチ2:
示されているようにインデックス列を正しく設定した後、 join
を使用します。
df2.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.set_index(['Index', 'AUTHOR_NAME'], inplace=True)
df.join(df2).reset_index()
ここの他の回答は、質問に対する非常に優れたエレガントなソリューションを提供しますが、非常にエレガントな方法でこの質問に回答するリソースを見つけました。また、参加/ LEFT、RIGHT、INNER、OUTERの結合を効果的に教える、データフレームのマージ。
Join And Merge Pandas Dataframe
このトピックの後、さらに探求者が彼の例を調べたいと思うと正直に感じます...