2017-10-22 5 views
1

私の問題については多くの投稿がありましたが、それらの問題は解決していないようです。私は、列に関して同じ2つのDFを持っています(dfTemp.rows> dfLags.rows)。パンダ同じラベルのDataFrameオブジェクトのみを比較できます

print(dfLags.columns.values) 
print(dfLags.dtypes) 
print(dfLags) 

は... ...一方

['Site ID' 'Port' 'outSpeed'] 
Site ID  object 
Port   object 
outSpeed float64 
dtype: object 
     Site ID  Port  outSpeed 
0  10.2.20.5 Lag 112 10000000000 
1  10.2.20.5 Lag 122 10000000000 
2  10.2.21.3 Lag 1 2000000000 
3  10.2.21.3 Lag 3 20000000000 
4  10.2.21.3 Lag 10 20000000000 
5 10.2.22.123 Lag 2 3000000000 
6 10.2.22.123 Lag 3 2000000000 
7 10.2.22.123 Lag 10 6000000000 
8 10.2.22.21 Lag 1 3000000000 
9 10.2.22.21 Lag 3 2000000000 
10 10.2.22.21 Lag 10 6000000000 
11 10.2.46.52 Lag 3 20000000000 
12 10.2.46.52 Lag 10 20000000000 

を生成します。

print(dfTemp.columns.values) 
print(dfTemp.dtypes) 
print(dfTemp) 

...生成:

['Site ID' 'Port' 'outSpeed'] 
Site ID  object 
Port   object 
outSpeed float64 
dtype: object 
      Site ID Port outSpeed 
0  10.2.22.74 1/5/7 1000000000 
1  10.2.22.74 1/1/7 1000000000 
2  10.2.22.74 1/3/7 1000000000 
3  10.2.22.74 1/4/7 1000000000 
4  10.2.20.5 3/1/3 1000000000 
5  10.2.46.52 3/2/1 1000000000 
6  10.2.46.52 3/2/10 1000000000 
7  10.2.46.52 Lag 10   NaN 
8  10.2.21.3 1/1/1 1000000000 
9  10.2.21.3 3/2/5 1000000000 
10  10.2.21.3 Lag 10   NaN 
..   ...  ...   ... 
11 10.2.21.251 1/1/2 1000000000 
181 10.2.22.123 1/2/21 1000000000 
182 10.2.22.123 2/1/13 1000000000 
183 10.2.22.123 2/1/14 1000000000 
184 10.2.22.123 2/1/17 1000000000 

[185 rows x 3 columns] 

私は比較しようとするときはいつでもエラーValueError: Can only compare identically-labeled DataFrame objectsが表示されます。私は、次のやろうとしている:

dfTemp.loc[ (dfTemp[[SITE_IP,PORT_NAME]]==dfLags[[SITE_IP,PORT_NAME]]) & (dfTemp["outSpeed"].empty), "outSpeed"] = \ 
dfLags.loc[ (dfTemp[[SITE_IP,PORT_NAME]]==dfLags[[SITE_IP,PORT_NAME]]) & (dfTemp["outSpeed"].empty), "outSpeed"] 

なぜ私はこのようなエラーを取得しています上の任意のヒント?

ありがとうございます!

+1

まあ、はい。比較のためには、両方の次元が同一でなければなりません。そうでなければ、パンダが他のものより多くの行を持っているときに、どのように比較することが期待できますか?余分な行はどのように比較されますか? –

+0

特に、インデックスは両方の軸に沿って整列する必要があります。 –

+0

エラーごとに、パンダはラベルについて不平を言いますが、行の量の不一致ではありません。ややこしい。同じサイズのDFだけを比較できることを意味しますか?それは意味をなさない。 ExcelのVLOOKUPのように行に沿って一致するものがある場合は、列名に基づいて比較し、情報を抽出したいと考えています。一方、私はあなたに「特にインデックスは両方の軸に沿って整列しなければならない」とは言いません。どういう意味ですか? –

答えて

1

EDIT:

あなたが必要set_indexcombine_firstを持つ:

df = (dfTemp.set_index(['Site ID', 'Port']) 
      .combine_first(dfLags.set_index(['Site ID', 'Port'])) 
      .reset_index()) 

print (df) 
     Site ID  Port  outSpeed 
0  10.2.20.5 3/1/3 1000000000 
1  10.2.20.5 Lag 112 10000000000 
2  10.2.20.5 Lag 122 10000000000 
3 10.2.21.251 1/1/2 1000000000 
4  10.2.21.3 1/1/1 1000000000 
5  10.2.21.3 3/2/5 1000000000 
6  10.2.21.3 Lag 1 2000000000 
7  10.2.21.3 Lag 10 20000000000 
8  10.2.21.3 Lag 3 20000000000 
9 10.2.22.123 1/2/21 1000000000 
10 10.2.22.123 2/1/13 1000000000 
11 10.2.22.123 2/1/14 1000000000 
12 10.2.22.123 2/1/17 1000000000 
13 10.2.22.123 Lag 10 6000000000 
14 10.2.22.123 Lag 2 3000000000 
15 10.2.22.123 Lag 3 2000000000 
16 10.2.22.21 Lag 1 3000000000 
17 10.2.22.21 Lag 10 6000000000 
18 10.2.22.21 Lag 3 2000000000 
19 10.2.22.74 1/1/7 1000000000 
20 10.2.22.74 1/3/7 1000000000 
21 10.2.22.74 1/4/7 1000000000 
22 10.2.22.74 1/5/7 1000000000 
23 10.2.46.52 3/2/1 1000000000 
24 10.2.46.52 3/2/10 1000000000 
25 10.2.46.52 Lag 10 20000000000 
26 10.2.46.52 Lag 3 20000000000 
+0

それは完全には機能しません。私がマージすると、マージされたデータとともに余分な列が得られます。 'Site_IP'と' Port'の両方が一致すると、dfTempの空の行にdfLagsのデータを埋めたいだけです。 –

+1

OOPs、私は間違っていた。私は完全に答えを変えて、それを確認してください。 – jezrael

+0

うわー!これは素晴らしい答えです!どうもありがとうございました! –

関連する問題