私はdf1
とdf2
という2つのデータフレームを持っています。 df2
からDisplay Name
がdf1
のDisplay Name
列にある場合、私はdf2
の値にdf1
のType
、Format
、Behavior
、Datatype
値を割り当てます。Pandas:別のデータフレームから重複した行を使用して複数のデータフレーム列を更新
私は考えることができるあらゆる方法でmerge
を試しました。私はloc
が私の最高の希望だと思っていますが、私は割り当ての構文を正しく得ることができません。また、私は簡潔な答え、好ましくは1つのライナーを探しています。
このような何か:
df2.loc[df2['Display Name'].isin(df1['Display Name']),/
['Type', 'Format', 'Behavior', 'Datatype']] = ???
マイコード:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(
{'Behavior': ['Attribute', 'Attribute', 'Attribute', 'Attribute', 'Attribute',
'Attribute', 'Attribute', 'Metric', 'Metric', 'Metric', 'Metric',
'Metric', 'Metric', 'Metric', 'Metric'],
'Datatype': ['object', 'object', 'object', 'object', 'object', 'object',
'object', 'int64', 'int64', 'int64', 'int64', 'float64',
'float64', 'float64', 'float64'],
'Display Name': ['Campaign', 'Campaign ID', 'Campaign ID', 'Campaign state',
'Campaign state', 'Currency', 'Currency', 'Impressions',
'Impressions', 'Clicks', 'Clicks', 'CTR', 'CTR', 'Avg. CPC',
'Avg. CPC'],
'Format': ['{}', '{}', '{}', '{}', '{}', '{}', '{}', '{:,.0f}', '{:,.0f}',
'{:,.0f}', '{:,.0f}', '{:.2f}%', '{:.2f}%', '${:,.2f}', '${:,.2f}'],
'Type': ['String', 'String', 'String', 'String', 'String', 'String', 'String',
'Integer', 'Integer', 'Integer', 'Integer', 'Percent', 'Percent',
'Currency', 'Currency']},
columns=['Display Name', 'Type', 'Format', 'Behavior', 'Datatype'])
df2 = pd.DataFrame(
{ 'Behavior': [ 'Attribute', 'Metric', 'Metric', 'Metric', 'Attribute',
'Metric', 'Metric', 'Attribute', 'Metric', 'Metric', 'Metric'],
'Datatype': [ 'object', 'float64', 'float64', 'float64', 'object', 'int64',
'int64', 'object', 'float64', 'float64', 'float64'],
'Display Name': [ 'Match type', 'Destination URL', 'Final URL',
'Mobile final URL', 'Labels', 'Impressions', 'Clicks',
'CTR', 'Avg. CPC', 'Cost', 'Avg. position'],
'Format': [ '{}', '{:.2f}', '{:.2f}', '{:.2f}', '{}', '{:,.0f}', '{:,.0f}',
'{}', '{:.2f}', '{:.2f}', '{:.2f}'],
'Type': [ 'String', 'Float', 'Float', 'Float', 'String', 'Integer',
'Integer', 'String', 'Float', 'Float', 'Float']},
columns=['Display Name', 'Type', 'Format', 'Behavior', 'Datatype'])
df2_vals_in_df1 = df2.loc[df2['Display Name'].isin(df1['Display Name']), df2.columns[:]]
df1_vals_in_df2 = df1.loc[df1['Display Name'].isin(df2['Display Name']), df1.columns[:]]
それがどのように見える:df1_vals_in_df2
Display Name
は、同じ名前を複数回持っているかもしれない方法
>>> df1
Display Name Type Format Behavior Datatype
0 Campaign String {} Attribute object
1 Campaign ID String {} Attribute object
2 Campaign ID String {} Attribute object
3 Campaign state String {} Attribute object
4 Campaign state String {} Attribute object
5 Currency String {} Attribute object
6 Currency String {} Attribute object
7 Impressions Integer {:,.0f} Metric int64
8 Impressions Integer {:,.0f} Metric int64
9 Clicks Integer {:,.0f} Metric int64
10 Clicks Integer {:,.0f} Metric int64
11 CTR Percent {:.2f}% Metric float64
12 CTR Percent {:.2f}% Metric float64
13 Avg. CPC Currency ${:,.2f} Metric float64
14 Avg. CPC Currency ${:,.2f} Metric float64
>>> df2
Display Name Type Format Behavior Datatype
0 Match type String {} Attribute object
1 Destination URL Float {:.2f} Metric float64
2 Final URL Float {:.2f} Metric float64
3 Mobile final URL Float {:.2f} Metric float64
4 Labels String {} Attribute object
5 Impressions Integer {:,.0f} Metric int64
6 Clicks Integer {:,.0f} Metric int64
7 CTR String {} Attribute object
8 Avg. CPC Float {:.2f} Metric float64
9 Cost Float {:.2f} Metric float64
10 Avg. position Float {:.2f} Metric float64
>>> df2_vals_in_df1
Display Name Type Format Behavior Datatype
5 Impressions Integer {:,.0f} Metric int64
6 Clicks Integer {:,.0f} Metric int64
7 CTR String {} Attribute object
8 Avg. CPC Float {:.2f} Metric float64
>>> df1_vals_in_df2
Display Name Type Format Behavior Datatype
7 Impressions Integer {:,.0f} Metric int64
8 Impressions Integer {:,.0f} Metric int64
9 Clicks Integer {:,.0f} Metric int64
10 Clicks Integer {:,.0f} Metric int64
11 CTR Percent {:.2f}% Metric float64
12 CTR Percent {:.2f}% Metric float64
13 Avg. CPC Currency ${:,.2f} Metric float64
14 Avg. CPC Currency ${:,.2f} Metric float64
注意。それらのType
、Format
、Behavior
、Datatype
の値は、常に両方の行で同じ値になります。 df2
の
予想される出力:
>>> df2
Display Name Type Format Behavior Datatype
0 Match type String {} Attribute object
1 Destination URL Float {:.2f} Metric float64
2 Final URL Float {:.2f} Metric float64
3 Mobile final URL Float {:.2f} Metric float64
4 Labels String {} Attribute object
5 Impressions Integer {:,.0f} Metric int64 <-- same
6 Clicks Integer {:,.0f} Metric int64 <-- same
7 CTR Percent {:.2f}% Metric float64 <-- changed
8 Avg. CPC Currency ${:,.2f} Metric float64 <-- changed
9 Cost Float {:.2f} Metric float64
10 Avg. position Float {:.2f} Metric float64
テイクアウト#1:行5、彼らはdf1
とdf2
の両方で同じであるため、6が同じです。
テイクアウト#2:String, {}, Attribute, object
Percent, {:.2f}%, Metric, float64
から変更行7、 - df2
からDisplay Name
がdf1
でDisplay Name
で見つかったため、df1
から行の値。
テイクアウェイ#3:行8は、テイクアウェイ#2で述べられているのと同じ理由で変更されました。
が試み:
Q1:Python Pandas: Merge or Filter DataFrame by Another. Is there a Better Way?
私は新しいデータフレームを作成しようとしていないよので、この質問には対応していません。私は既存のデータフレームの値を別のものから置き換えることを試みています。
Q2:この例は、正しい値を持つ1人のDFが含まれているため、私の状況は正しいと間違った値を持つDFであるのに対し、Replace column values based on another dataframe python pandas - better way?
は、この質問には対応していません。
これは長い質問です。私はちょうど十分な文脈を提供したかった。
さて、あなたはDF1を縮小することによって、より読みやすい本を作ることができるし、実質的にdf2である。 5行2列は、同じように簡単にポイントを取得します。あなたが 'combine_first()'を探しているだけですか? – JohnE
フィードバックいただきありがとうございます。おそらくTMI(あまりにも多くの情報)でした。私はあなたの提案 'combine_first()'を使って解決策を見つけました。しかし、重複排除が必要な行が追加されるため、私はそれを嫌っています。第2に、上記の期待される出力を得るために、私はウィザード型のカスタムマッピングを行う必要があります。 – Jarad