簡體   English   中英

如何基於列比較兩個不同大小的數據框?

[英]How to compare two data frames of different size based on a column?

我有兩個不同大小的數據框

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.我想根據“YearDeci”列比較 df1 和 df2。 並找出常見條目和唯一條目(常見行以外的行)。

2.output 基於列“YearDeci”的 df1 中的公共行(相對於 df2)。

3.output 基於列“YearDeci”的 df1 中的唯一行(相對於 df2)。

*注意:“YearDeci”中十進制值的差異高達+/-0.0001是可以容忍的

預期的 output 就像

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 

首先比較df1.YearDecidf2.YearDeci的“每個與每個”原則。 要進行比較,請使用np.isclose function 和假定的絕對公差。

結果是一個boolean數組:

  • 第一個索引 - df1中的索引,
  • 第二個索引 - df2中的索引。

然后,使用np.argwhere ,找到True值的索引,即來自df1df2的“相關”行的索引,並從中創建一個 DateFrame。

執行上述操作的代碼是:

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

然后,讓索引對指向兩個 DataFrame 中的“相關”行,執行以下合並:

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

最后一步是刪除兩個“輔助索引列”( ind1ind2 ):

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  

公共行的索引已經在變量 ind 中

所以要找到唯一的條目,我們需要做的就是根據“ind”中的索引從df1中刪除公共行所以最好讓另一個CSV文件包含公共條目並將其讀取到變量中。

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

df1_uniq = df1.drop(df1.index[ind.ind1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM