2016-05-09 6 views
1

Я с dataframe именем loc_df с двумя колоннами бункеров, который выглядит, как это ...Значения в одном кадре данных в бункерах другого блока данных?

> loc_df 

loc_x_bin  loc_y_bin  
(-20, -10]  (0, 50]   
(-140, -130]  (100, 150]   
(0, 10]   (-50, 0]   

Я еще dataframe называют данные, которые выглядят так ...

> data 

    loc_x   loc_y 
    -15   25 
    30   35 
    5   -45 
    -135   -200 

Я хочу сделать новый булевский столбец в данных, который показывает, находится ли loc_x в пределах значений loc_x_bin и loc_y в пределах loc_y_bin данных кадра loc_df. loc_x и loc_y должны быть в loc_x_bin и loc_y_bin той же строки. Например:

> data 

loc_x   loc_y   in_bins 
    -15    25    true 
    30    35    false 
    5    -45    true 
    -135   -200   false 
    5    25    false** 

UPDATE ** Несмотря на то, находится в пределах 5 (0,10] loc_x_bin и 25 находится в пределах (0, 50] loc_y_bin, то loc_x_bin и loc_y_bin не находятся в той же самой строке, так что я хочу это ложный

+0

каковы объекты в 'loc_df'? Эти строки? ''(-20, -10]'' – piRSquared

+0

Это категории – Hound

+0

запустите этот 'type (loc_df.iloc [0, 0])' и сообщите, что вы получаете – piRSquared

ответ

1

UPDATE2:. если вы хотите проверить, что какx и y принадлежат бункерам из одной и той же строки в df_loc (или loc_df):

xstep = 10 
ystep = 50 

In [201]: (df.assign(bin=(pd.cut(df.loc_x, np.arange(-500, 500, xstep)).astype(str) 
    .....:     + 
    .....:     pd.cut(df.loc_y, np.arange(-500, 500, ystep)).astype(str) 
    .....:    ) 
    .....:   ) 
    .....:)['bin'].isin(df_loc.sum(axis=1)) 
Out[201]: 
0  True 
1 False 
2  True 
3 False 
4 False 
Name: bin, dtype: bool 

Объяснение:

In [202]: (df.assign(bin=(pd.cut(df.loc_x, np.arange(-500, 500, xstep)).astype(str) 
    .....:     + 
    .....:     pd.cut(df.loc_y, np.arange(-500, 500, ystep)).astype(str) 
    .....:    ) 
    .....:   ) 
    .....:) 
Out[202]: 
    loc_x loc_y      bin 
0 -15  25   (-20, -10](0, 50] 
1  30  35   (20, 30](0, 50] 
2  5 -45   (0, 10](-50, 0] 
3 -135 -200 (-140, -130](-250, -200] 
4  5  25   (0, 10](0, 50] 

In [203]: df_loc.sum(axis=1) 
Out[203]: 
0   (-20, -10](0, 50] 
1 (-140, -130](100, 150] 
2   (0, 10](-50, 0] 
dtype: object 

UPDATE: если вы хотите проверить, принадлежит ли x к loc_x_bin и y принадлежит loc_y_bin (не обязательно из одной и той же строки в df_loc):

если df_loc.dtypes не показывает category для обеих столбцов, то вы можете захотеть c onvert вашей категории до category DTYPE первый:

df_loc.loc_x_bin = df_loc.loc_x_bin.astype('category') 
df_loc.loc_y_bin = df_loc.loc_y_bin.astype('category') 

, то вы можете классифицировать ваши столбцы в df "на лету":

xstep = 10 
ystep = 50 

df['in_bins'] = ( (pd.cut(df.loc_x, np.arange(-500, 500, xstep)).isin(df_loc.loc_x_bin)) 
        & 
        (pd.cut(df.loc_y, np.arange(-500, 500, ystep)).isin(df_loc.loc_y_bin)) 
       ) 

Тест:

In [130]: df['in_bins'] = ( (pd.cut(df.loc_x, np.arange(-500, 500, xstep)).isin(df_loc.loc_x_bin)) 
    .....:      & 
    .....:      (pd.cut(df.loc_y, np.arange(-500, 500, ystep)).isin(df_loc.loc_y_bin)) 
    .....:    ) 

In [131]: df 
Out[131]: 
    loc_x loc_y in_bins 
0 -15  25 True 
1  30  35 False 
2  5 -45 True 
3 -135 -200 False 
+0

Хм, я встречаюсь я должен дополнительно ограничить критерии, так что loc_x и loc_y должны быть в буфере x_cat и в буфере y_cat той же строки. Так что, если бы у меня было: 'loc_x = -135 и loc_y = 25' Это должно быть неверно, но все верно. Извините, форматирование – Hound

+0

@Назад, можете ли вы обновить свой вопрос или привести примеры? – MaxU

+0

Хорошо, я отредактировал этот вопрос. Надеюсь, теперь это ясно.Если нет, сообщите мне, и я попытаюсь объяснить это более четко. – Hound

Смежные вопросы