2016-09-08 4 views
1

У меня есть два dataframes тех же размеров, которые выглядят как:Использование двух различных кадров данных для вычисления новой переменной

df1 
ID flag 
0  1 
1  0 
2  1 

    df2 
ID flag 
0  0 
1  1 
2  0 

В обоих dataframes я хочу, чтобы создать новую переменную, которая обозначает флаг аддитивный. Таким образом, новая переменная будет выглядеть следующим образом:

df1 
ID flag new_flag 
0  1  1 
1  0  1 
2  1  1 

    df2 
ID flag new_flag 
0  0  1 
1  1  1 
2  0  1 

Так что, если либо флаг столбцов является 1 новый флаг будет 1. Я попробовал этот код:

df1['new_flag']= 1 
df2['new_flag']= 1 

df1['new_flag'][(df1['flag']==0)&(df1['flag']==0)]=0 
df2['new_flag'][(df2['flag']==0)&(df2['flag']==0)]=0 

Я бы ожидать такое же количество 1 в обоих new_flag, но они отличаются. Это потому, что я не иду по строкам подряд? Как этот вопрос? pandas create new column based on values from other columns Если да, то как мне включить критерии из обоих данных?

+0

Кроме того, что вы пытались в принципе должны работали, но это называется прикованными индексации, так что вы, возможно, работает на экземпляре, который является, почему он не работает, вы должны изменить to 'df1.loc [(df1 ['flag'] == 0) & (df1 ['flag'] == 0), 'new_flag'] = 0 df2.loc [(df2 ['flag'] == 0) & (df2 [ 'флаг'] == 0), 'New_flag'] = 0 ' – EdChum

ответ

2

Вы можете использовать np.logical_or для достижения этой цели, если мы устанавливаем df1 быть все 0 за исключением последней строки, так что мы не просто получить столбец 1-х, мы можем отбрасывать результат np.logical_or использованием astype(int) для преобразования логический массив 1 и 0:

In [108]: 
df1['new_flag'] = np.logical_or(df1['flag'], df2['flag']).astype(int) 
df2['new_flag'] = np.logical_or(df1['flag'], df2['flag']).astype(int) 
df1 

Out[108]: 
    ID flag new_flag 
0 0  0   0 
1 1  0   1 
2 2  1   1 

In [109]: 
df2 

Out[109]: 
    ID flag new_flag 
0 0  0   0 
1 1  1   1 
2 2  0   1 
Смежные вопросы