2017-03-15 24 views
3

mergeAllGB.IntensityカラムNaNの値を、ID、平日および時間が一致する別のデータフレームの値で更新したいとします。私は試しています:パンダ/ Python - 値の一致に基づいてデータフレームを更新する

mergeAllGB.Intensity[mergeAllGB.Intensity.isnull()] = precip_hourly[precip_hourly.SId == mergeAllGB.SId & precip_hourly.Hour == mergeAllGB.Hour & precip_hourly.Weekday == mergeAllGB.Weekday].Intensity 

ただし、これはValueError: Series lengths must match to compareを返します。どうすればこのことができますか?

最小例:

Inputs: 
_______ 
mergeAllGB 
SId Hour Weekday Intensity 
1 12 5  NaN 
2 5 6  3 

precip_hourly 
SId Hour Weekday Intensity 
1 12 5  2 

Desired output: 
________ 
mergeAllGB 
SId Hour Weekday Intensity 
1 12 5  2 
2 5 6  3 
+0

私は 'set_value'を使ってこの作業をしようとしています。しかし、私は同じエラー/不適切な長さのために不正確な結果を得るだろうと仮定します。 'df = mergeALLGB.set_value(mergeAllGB ['Intensity']。isnull()、 'Intensity'、precip_hourly ['Intensity'])' df = mergeALLGB.set_value(mergeAllGB ['Intensity'])を呼び出すと、 – MattR

答えて

0

TL; DRこの意志(たぶん)ワーク:

# Set the index to compare by 
df = mergeAllGB.set_index(["SId", "Hour", "Weekday"]) 
fill_df = precip_hourly.set_index(["SId", "Hour", "Weekday"]) 

# Fill the nulls with the relevant values of intensity 
df["Intensity"] = df.Intensity.fillna(fill_df.Intensity) 
# Cancel the special indexes 
mergeAllGB = df.reset_index() 

あるいは、最後の前の行があってもよい

df.loc[df.Intensity.isnull(), "Intensity"] = fill_df.Intensity 

における割り当てと比較はインデックスで行われます(この例では表示されません)。

この例では、precip_hourly.SId == mergeAllGB.SIdを実行するとValueError: Can only compare identically-labeled Series objectsになります。これは、2つの列を値で比較しようとしたためですが、precip_hourlyにはインデックス1(デフォルトのインデックス付けが0から始まる行)がないため、比較が失敗します。

比較が成功したと仮定しても、割り当て段階に問題があります。 パンダはインデックスに従って割り当てようとしますが、これは意図した意味を持ちません。

幸いにも、我々は我々自身の利益のためにそれを使用することができます - インデックスを設定することにより、["SId", "Hour", "Weekday"]であることを、任意の比較と割り当てはどこインデックスのでdf.Intensity= fill_df.Intensityを実行するとfill_df.Intensitydf.Intensityに値を割り当てます、このインデックスに関連して行われます一致している、つまり、どこにいても同じです["SId", "Hour", "Weekday"]

IntensityNAである場所にのみ割り当てるには、最初にフィルタリングする必要があります(またはfillnaを使用)。 df.Intensity[df.Intensity.isnull()]のフィルタは機能しますが、同じ値(SIdHourWeekday)の値が複数ある場合、その割り当ては失敗する可能性があります。

関連する問題