Как сравнить два кадра данных разного размера на основе столбца? - PullRequest
1 голос
/ 29 октября 2019

У меня есть два фрейма данных с разным размером

df1

     YearDeci  Year  Month  Day  ...  Magnitude    Lat    Lon  
0     1551.997260  1551     12   31  ...        7.5  34.00  74.50      
1     1661.997260  1661     12   31  ...        7.5  34.00  75.00      
2     1720.535519  1720      7   15  ...        6.5  28.37  77.09      
3     1734.997260  1734     12   31  ...        7.5  34.00  75.00      
4     1777.997260  1777     12   31  ...        7.7  34.00  75.00      

и

df2

         YearDeci  Year  Month  Day  Hour  ...  Seconds   Mb     Lat     Lon  
0     1669.510753  1669      6    4     0  ...        0  NaN  33.400  73.200    
1     1720.535519  1720      7   15     0  ...        0  NaN  28.700  77.200    
2     1780.000000  1780      0    0     0  ...        0  NaN  35.000  77.000    
3     1803.388014  1803      5   22    15  ...        0  NaN  30.600  78.600    
4     1803.665753  1803      9    1     0  ...        0  NaN  30.300  78.800
5     1803.388014  1803      5   22    15  ...        0  NaN  30.600  78.600.

1. Я хотел сравнитьdf1 и df2 основаны на столбце YearDeci. и найдите общие записи и уникальные записи (строки, отличные от общих строк).

2. вывод общих строк (относительно df2) в df1 на основе столбца YearDeci.

3. вывести уникальные строки (относительно df2) в df1 на основе столбца YearDeci.

* Примечание: разница в десятичных значениях до + / - 0,0001 в'YearDeci' допустим

Ожидаемый результат равен

row_common =

      YearDeci     Year   Month  Day ...   Mb     Lat     Lon 
2     1720.535519  1720      7   15  ...  6.5  28.37  77.09

row_unique =

      YearDeci  Year  Month  Day  ...  Magnitude    Lat    Lon  
0     1551.997260  1551     12   31  ...        7.5  34.00  74.50      
1     1661.997260  1661     12   31  ...        7.5  34.00  75.00           
3     1734.997260  1734     12   31  ...        7.5  34.00  75.00      
4     1777.997260  1777     12   31  ...        7.7  34.00  75.00 

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Индексы общих строк уже находятся в переменной ind

Таким образом, чтобы найти уникальные записи, все, что нам нужно сделать, это удалить общие строки из df1 в соответствии с индексами в "ind"Поэтому лучше сделать другой CSV-файл, содержащий общие записи, и прочитать его в переменную.

df1_common = pd.read_csv("df1_common.csv")

df1_uniq = df1.drop(df1.index[ind.ind1])
0 голосов
/ 30 октября 2019

Сначала сравните df1.YearDeci с df2.YearDeci по принципу "каждый с каждым". Для сравнения используйте функцию np.isclose с предполагаемым абсолютным допуском.

В результате получается массив boolean :

  • первый индекс- индекс в df1 ,
  • второй индекс - индекс в df2 .

Затем, используя np.argwhere , найдите индексы True значений, т.е. индексы "коррелированных" строк из df1 и df2 и создайте из них DateFrame.

Код для выполнения вышеуказанных операций:

ind = pd.DataFrame(np.argwhere(np.isclose(df1.YearDeci[:, np.newaxis],
    df2.YearDeci[np.newaxis, :], atol=0.0001, rtol=0)),
    columns=['ind1', 'ind2'])

Затем, имея пары индексов, указывающих на «коррелированные» строки в обоих кадрах данных, выполните следующее объединение:

result = ind.merge(df1, left_on='ind1', right_index=True)\
    .merge(df2, left_on='ind2', right_index=True, suffixes=['_1', '_2'])

Окончательноенеобходимо удалить оба «столбца вспомогательного индекса» ( ind1 и ind2 ):

result.drop(columns=['ind1', 'ind2'], inplace=True)

Результат (разделенный на 2 части):

    YearDeci_1  Year_1  Month_1  Day_1  Magnitude  Lat_1  Lon_1   YearDeci_2  \
0  1720.535519    1720        7     15        6.5  28.37  77.09  1720.535519   

   Year_2  Month_2  Day_2  Hour  Seconds  Mb  Lat_2  Lon_2  
0    1720        7     15     0        0 NaN   28.7   77.2  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...