2017-08-31 12 views
0

私は多くの列multiindexシリーズでインデックスが見つからない場合、NaNを返す方法は?

を持つ2つのデータフレームのDF1とDF2を持って

DF1 -

は私がDF2に新しい列を追加する必要がある[22035行×11列] - [2756003行×44列]

DF2戻り

t1 = df1.groupby(['category', 'manufacturer']) 
t2=t1[c1].mean() 
str1='_'.join(col) 
df2[c1+'_'+str1+'_mean']=t2[df2[['category','manufacturer']].as_matrix()].values 

結果によってグループに基づいて、DF1 からターゲット列の平均値(DF1およびDF2内で同じ列):

IndexError: arrays used as indices must be of integer (or boolean) type 

T2 - などの店舗のマルチインデックスシリーズ:私は、既存のインデックスを使用している場合

category manufacturer 
1   2    0.000000 
      4    8.796840 
      10    2.312407 
      19    1.135094 
      24    4.355000 

私は結果

In [302]: t2[1, 2] 
Out[302]: 0.0 

しかし、私はどこ332、[410、332] T2を呼び出す場合に予想される取得しますdf2で発表され、df1で発表されていないメーカーのIDです。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

私が欲しい代わりに私たちが得るようにNaNは

df2['manufacturer'].map(t2) 

の場合は1列しかありません。

df2 = pd.merge(df2, t2.reset_index(), on=['category','manufacturer'], how='left') 

'category''manufacturer'は、その後のみ 列df2と共通でt2.reset_index()シェア、行している場合、デフォルトでは、pd.mergeは、すべての共有の列に加わり、以来:df2t2をマージする

答えて

0

使用pd.merge

df2 = pd.merge(df2, t2.reset_index(), how='left') 

これがあるので枚の
import numpy as np 
import pandas as pd 
np.random.seed(2017) 

df1 = pd.DataFrame(np.random.randint(4, size=(100,3)), columns=['category', 'manufacturer', 'col']) 

df2 = pd.DataFrame(np.random.randint(1, 5, size=(100,3)), columns=['category', 'manufacturer', 'col2']) 

t1 = df1.groupby(['category', 'manufacturer']) 
c1 = 'col' 
t2 = t1[c1].mean() 
col = ['foo', 'bar'] 
str1='_'.join(col) 
t2.name = c1+'_'+str1+'_mean' 
df2 = pd.merge(df2, t2.reset_index(), on=['category','manufacturer'], how='left') 
print(df2.head()) 

プリント

category manufacturer col2 col_foo_bar_mean 
0   1    1  2   1.333333 
1   3    4  3    NaN 
2   4    4  2    NaN 
3   3    3  1   1.000000 
4   3    2  1   1.777778 

df2の行いる欠損値を持つ列のNaNが割り当てられt2に該当する 行が存在しない「左ジョイン」。

+0

'はAttributeErrorがありました: 'CategoricalIndex' オブジェクトがカテゴリ '' メーカーの ' DF2 = pd.merge(DF2、t2.to_frame()、left_on = [後 is_dtype_equal'' 'は属性を持っていません'] =どの真 right_index =、' 左カテゴリ」、 'メーカー' ') ' 私は ' DF2 = pd.merge(DF2、t2.reset_index()、left_on = [この部分を変更します' ]、right_on = ['category'、 'manufacturer']、how = 'left') ' これは機能しています!おかげで – Roman

+0

偉大な、訂正のおかげで。'left_on'と' right_on'は同じ列名を指定するので、単純に 'on = ['category'、 'manufacturer']'にすることができます。また、これらが2つのDataFramesで共有される唯一のカラムであれば、それを完全に省略することもできます。 – unutbu

関連する問題