Как найти строки, которые НЕ разделяют общую дату (или индекс) в кадре данных Python - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть два фрейма данных панд, у каждого из которых есть столбец даты.Мне нужно найти строки, у которых нет общей даты

Если предположить, что я создал индекс для столбца даты, существуют решения для поиска строк с общим индексом, подобным этому Но яне может найти элегантное решение для поиска строк, которые не имеют общей даты.например, df1

                      values 1

28/11/2000          -0.055276
29/11/2000           0.027427
30/11/2000           0.066009
01/12/2000           0.012749
04/12/2000           0.113892

df2

                       values 2

24/11/2000            -0.004808
27/11/2000            -0.001812
28/11/2000            -0.026316
29/11/2000             0.015222
30/11/2000            -0.024480

дают два кадра данных: один, содержащий строки в df1, которые не имеют общих дат

df11

                     value 1

01/12/2000           0.012749
04/12/2000           0.113892

А другой, который содержит строки в df2, которые не имеют общих дат df22

                       value 2
24/11/2000            -0.004808
27/11/2000            -0.001812

Я в порядке с любым другим форматом вывода, например, с выводом обоих кадров данных в одномодин кадр данных, если мы можем уменьшить количество шагов.

Существуют решения для поиска строк, которые не равны друг другу , например, , но тогда каждый элемент строки имеетбыть таким же.

Может кто-нибудь помочь придумать элегантное решение.Спасибо за любой вклад

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Без переиндексации я бы получал уникальные даты от каждого df, а затем маскировал другие, используя эти даты.Что-то вроде

df1 = df1[~df1['date'].isin(df2['date'].unique())]
df2 = df2[~df2['date'].isin(df1['date'].unique())]
0 голосов
/ 10 февраля 2019

Существует магия merge, использующая indicator

s=df1.merge(df2,left_index=True,right_index=True,indicator=True,how='outer')
df1_1=s.loc[s['_merge']=='left_only',['values1']]
df2_2=s.loc[s['_merge']=='right_only',['values2']]
df1_1
             values1
01/12/2000  0.012749
04/12/2000  0.113892
df2_2
             values2
24/11/2000 -0.004808
27/11/2000 -0.001812
0 голосов
/ 10 февраля 2019

Использование Index.difference:

df11 = df1.loc[df1.index.difference(df2.index)]
print (df11)
            values 1
01/12/2000  0.012749
04/12/2000  0.113892

df22 = df2.loc[df2.index.difference(df1.index)]
print (df22)
            values 2
24/11/2000 -0.004808
27/11/2000 -0.001812

Numpy решение с numpy.setdiff1d:

df11 = df1.loc[np.setdiff1d(df1.index, df2.index)]
df22 = df2.loc[np.setdiff1d(df2.index, df1.index)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...