簡體   English   中英

使用唯一索引創建Pandas Dataframe

[英]create Pandas Dataframe with unique index

我是否可以創建一個具有唯一索引或列的數據框,類似於在mysql中創建唯一鍵,如果我嘗試添加重復索引,它將返回錯誤?

或者,我唯一的選擇是創建一個if語句並在追加之前檢查數據幀中的值?

編輯:

看來我的問題有點不清楚。 對於唯一列,我的意思是我們不能在列中包含非唯一值。

df.append(new_row, verify_integrity=True)

我們可以檢查所有列,但是我們如何只檢查一列或兩列?

您可以使用df.append(..., verify_integrity=True)來維護唯一的索引:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(12).reshape(3,4), columns=list('ABCD'))
dup_row = pd.DataFrame([[10,20,30,40]], columns=list('ABCD'), index=[1])
new_row = pd.DataFrame([[10,20,30,40]], columns=list('ABCD'), index=[9])

這會成功附加一個新行(索引為9):

df.append(new_row, verify_integrity=True)
#     A   B   C   D
# 0   0   1   2   3
# 1   4   5   6   7
# 2   8   9  10  11
# 9  10  20  30  40

這會引發ValueError,因為1已經在索引中:

df.append(dup_row, verify_integrity=True)
# ValueError: Indexes have overlapping values: [1]

雖然上面的工作是為了確保唯一的索引,但我不知道確保唯一索引的類似方法。 從理論上講,您可以轉置DataFrame,附加verify_integrity=True然后再轉置,但通常我不建議這樣做,因為當列dtypes不完全相同時,轉置可以改變dtypes。 (當列dtypes不完全相同時,轉置的DataFrame會獲得object dtype的列。與對象數組之間的轉換可能對性能不利。)

如果您需要唯一的行和列索引,那么可能更好的選擇是stack您的DataFrame,以便所有唯一列索引級別成為行索引級別。 然后,您可以在重新整形的DataFrame上使用appendverify_integrity=True

OP的后續問題:

使用df.append(new_row,verify_integrity = True),我們可以檢查所有列,但是如何只檢查一列或兩列?

要檢查一列的唯一性,請說列名是value ,可以嘗試

df['value'].duplicated().any()

這將檢查此列中是否有任何重復。 如果重復,那么它不是唯一的。


給定兩列(比如C1C2 )來檢查是否存在重復 ,我們仍然可以使用DataFrame.duplicated

df[["C1", "C2"]].duplicated()

它將檢查行方式的唯一性。 您可以再次使用any來檢查返回的值是否為True


給定2列,比如C1C2 ,檢查列是否包含重復值,我們可以使用apply。

df[["C1", "C2"]].apply(lambda x: x.duplicated().any())

這將將函數應用於每列。


注意

pd.DataFrame([[np.nan, np.nan],
              [ np.nan, np.nan]]).duplicated()

0    False
1     True
dtype: bool

np.nan也將被duplicated捕獲。 如果要忽略np.nan ,可以先嘗試選擇非nan部分。

暫無
暫無

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

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