Сравните столбцы в разных пирамидах - PullRequest
0 голосов
/ 31 августа 2018

У меня есть два кадра данных, один с ежедневной информацией, начиная с 1990 года, и один с ежедневной информацией, начиная с 2000 года. Оба кадра данных содержат информацию, заканчивающуюся в 2016 году.

df1:

   Date       A     B     C 
1990-01-01   3.0  40.0  70.0  
1990-01-02  20.0  50.0  80.0  
1990-01-03  30.0  60.0  90.0  
1990-01-04   2.0   1.0   1.0 
1990-01-05   1.0   8.0   3.0  

df2:

   Date       A     B     C 
2000-01-01   NaN   NaN   NaN  
2000-01-02   5.0   NaN   NaN  
2000-01-03   1.0   NaN   5.0  
2000-01-04   2.0   4.0   8.0 
2000-01-05   1.0   3.0   4.0 

Мне нужно сравнить столбцы в df1 и df2, которые имеют одно и то же имя, что обычно не слишком сложно, но мне нужно сравнить их с точки, в которой есть данные, доступные в обоих кадры данных для данного столбца (например, от df2, 2000-01-02 в столбце 'A', 2000-01-04 в 'B'). Мне нужно вернуть True, если они совпадают с этого момента, и False, если они разные. Я начал с слияния, которое дает мне:

df2.merge(df1, how = 'left', on = 'Date')


   Date      A.x   B.x   C.x   A.y   B.y   C.y   
2000-01-01   NaN   NaN   NaN   3.0   4.0   5.0
2000-01-02   5.0   NaN   NaN   5.0   9.0   2.0
2000-01-03   1.0   NaN   5.0   1.0   6.0   5.0
2000-01-04   2.0   4.0   8.0   2.0   4.0   1.0
2000-01-05   1.0   3.0   4.0   1.0   3.0   3.0

Я выяснил, как найти общую дату, но застрял в том, как сделать то же самое / другое сравнение. Может ли кто-нибудь помочь мне сравнить столбцы с точки, в которой есть общее значение? Словарь приходит на ум в качестве полезного формата вывода, но он не является обязательным:

comparison_dict = {
    "A" : True,
    "B" : True,
    "C" : False
}

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Использование fillna с eq

df2.fillna(df1).eq(df1).all(0)

A        True
B        True
C       False
dtype: bool

Это работает, заполняя NaN значения действительными значениями от df1, поэтому они всегда будут равны, где df2 равно нулю (по сути, то же самое, что игнорировать их). Далее мы создаем логическую маску, сравнивающую два массива:

df2.fillna(df1).eq(df1)

               A     B      C
2000-01-01  True  True   True
2000-01-02  True  True   True
2000-01-03  True  True   True
2000-01-04  True  True  False
2000-01-05  True  True  False

Наконец, мы утверждаем, что все значения для каждого столбца равны True, чтобы столбцы считались равными.


Настройка

Похоже, что вы скопировали неправильный DataFrame для df1 на основе вашего желаемого вывода и слияния, поэтому я извлек его из вашего merge:

df1 = pd.DataFrame({'A': {'2000-01-01': 3.0, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': 4.0, '2000-01-02': 9.0, '2000-01-03': 6.0, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': 5.0, '2000-01-02': 2.0, '2000-01-03': 5.0, '2000-01-04': 1.0, '2000-01-05': 3.0}})

df2 = pd.DataFrame({'A': {'2000-01-01': np.nan, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': np.nan, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': 5.0, '2000-01-04': 8.0, '2000-01-05': 4.0}})
0 голосов
/ 31 августа 2018

Проверьте с eq и isnull Данные с user3483203

((df1.eq(df2))|df2.isnull()|df1.isnull()).all(0)
Out[22]: 
A     True
B     True
C    False
dtype: bool
0 голосов
/ 31 августа 2018

Предполагая, что столбец Date является индексом.

  1. По умолчанию стек будет отбрасывать nan
  2. Выравнивание с 'inner' логика
  3. Проверка равенства
  4. Сгруппировать и проверить все True

pd.Series.eq(*df1.stack().align(df2.stack(), 'inner')).groupby(level=1).all()

Если Date не является индексом

pd.Series.eq(
    *df1.set_index('Date').stack().align(
        df2.set_index('Date').stack(), 'inner'
    )
).groupby(level=1).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...