2017-01-10 15 views
2

私の問題は、startstopの列とcounterの列を持つデータフレーム(df1)があることです。私はvaluecountの列を持つ別のデータフレーム(df2)を持っています。 startstopにdf2のvalueが含まれているdf1の行を探して、df2のcountをdf1に追加します。 2つのデータフレームは異なる行を持ち、注文されません。第2のdfを使用してパンダdfを更新する

私はループをdf2を通して行ごとに書きましたが、速度が遅すぎるため、私ができる結合またはマージのタイプがあるかどうか疑問に思っていました。ご協力ありがとうございました。

import pandas as pd 

df1 = pd.DataFrame() 
df1['start'] = range(1,11) 
df1['stop'] = range(2,12) 
df1['count'] = [0]*10 
#df1: 
# start stop count 
#0  1  2  0 
#1  2  3  0 
#2  3  4  0 
#3  4  5  0 
#4  5  6  0 
#5  6  7  0 
#6  7  8  0 
#7  8  9  0 
#8  9 10  0 
#9  10 11  0 


df2 = pd.DataFrame() 
df2['count'] = range(21,26) 
df2['value'] = [x + 0.5 for x in range(1,6)] 
#df2: 
# count value 
#0  21 1.5 
#1  22 2.5 
#2  23 3.5 
#3  24 4.5 
#4  25 5.5 

#Line below doesn't work, throws: 
#ValueError: Can only compare identically-labeled Series objects 
df1[df2[(df1.start < df2.value) & (df2.value < df1.stop)], 'count'] += df2.count 

#desired update of df1: 
# start stop count 
#0  1  2  21 
#1  2  3  22 
#2  3  4  23 
#3  4  5  24 
#4  5  6  25 
#5  6  7  0 
#6  7  8  0 
#7  8  9  0 
#8  9 10  0 
#9  10 11  0 
+0

に行くと仮定するパラメータside='left'

  • 使用side='right'によって決定され、あなたの間隔は、常に長さ1はありますか?その場合は、df2の値列でnp.floor()を使用し、df1.start = d2.valueの2つのデータフレームをマージします。その後、開始数と合計数でグループ化することができます – scomes

  • +0

    これらは常に長さとは限りません1 – mitoRibo

    +0

    テーブルをマージしてから、applyを使用してカウント列を更新してください。 –

    答えて

    3
    • で挿入する位置を見つけるためにsearchsortedを使用しています。
    • 間隔が重複せずにエンドポイントを共有するため、これは機能します。
    • 6は、[6, 7)の区間に入るものとします。これは6間隔(5, 6]

    df1.loc[ 
        df1.index[df1.start.searchsorted(df2.value) - 1], 
        'count' 
    ] += df2['count'].values 
    
        start stop count 
    0  1  2  21 
    1  2  3  22 
    2  3  4  23 
    3  4  5  24 
    4  5  6  25 
    5  6  7  0 
    6  7  8  0 
    7  8  9  0 
    8  9 10  0 
    9  10 11  0 
    
    +0

    素晴らしい、ありがとう! – mitoRibo

    関連する問題