簡體   English   中英

合並兩個帶有兩項索引的 Pandas 數據幀會返回非唯一鍵

[英]Merging two pandas dataframes with two-term index returns non-unique keys

編輯

我寫這篇文章時認為問題出在merge()join() ,但問題出在從groupby()獲得的結果上。 如果你找到了這篇文章,那么你會因為同樣的原因得到同樣的錯誤。 因此,我保持標題不變。

原帖

我有兩個 Pandas 數據框,每個數據框包含三列。 類型是:

A: category
B: uint32
C: uint32

我按前兩列將它們分組並應用一個函數,如下所示:

df1 = df1.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})
df2 = df2.groupby(["A", "B"]).apply(my_function, meta={"Res_1":"uint32", "Res_2":"float32", "Res_3":"float32"})

生成的兩個數據幀具有三列,以及一個由兩個術語(最初是 A 和 B 列)組成的索引。 它們看起來像這樣:

                          Res_1       Res_2       Res_3
A        B                                   
chrA01   1                    0    0.000000    0.000000
         5001                 0    0.000000    0.000000
         35001             2656    0.967225   21.346008
         55001              261    1.000000   27.003832
chrC01   1                  131    0.411950    8.610687
...                         ...         ...         ...
         10001                0    0.000000    0.000000
chrA01   30001             1511    1.000000   25.416943
         90001             1407    1.000000   25.073915
chrC01   30001                0    0.000000    0.000000
         90001                0    0.000000    0.000000

然后我想使用df1df2索引的聯合將它們合並到一個數據幀中,所以我使用how="outer"選項on=["A", "B"]

df = pd.merge(df1, df2, how="outer", on=["A", "B"], validate="one_to_one")

但是,由於我正在執行validate="one_to_one" ,因此出現此錯誤:

pandas.errors.MergeError: Merge keys are not unique in either left or right dataset; not a one-to-one merge

我知道鍵應該是唯一的,因為我已經評估了兩個數據框的生成及其內容。

也許我在做merge()錯誤? 我的嫌疑人正在指定on=...選項。 有沒有一種方法可以指定on=index即使它是具有兩個術語的索引?

在查看索引和唯一索引的建議之后,我發現了問題。 AB上執行groupby()時,使用apply()調用的函數返回一行,其中包含正確的結果和一個完整的NaN值。 原因尚待確定。

由於奇怪的輸出排序,這兩個輸出在數據幀中不是一個接一個。 因此,我在寫這篇文章時沒有看到第二行NaN

生成數據幀后,我現在為每個運行df.dropna(how="all")並且重復的索引消失了。 我覺得這不是一個干凈的解決方案,因為那些NaN行一開始就不應該存在,但現在我找到了這個補丁。

暫無
暫無

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

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