[英]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上使用append
和verify_integrity=True
。
OP的后續問題:
使用df.append(new_row,verify_integrity = True),我們可以檢查所有列,但是如何只檢查一列或兩列?
要檢查一列的唯一性,請說列名是value
,可以嘗試
df['value'].duplicated().any()
這將檢查此列中是否有任何重復。 如果重復,那么它不是唯一的。
給定兩列(比如C1
和C2
)來檢查是否存在重復行 ,我們仍然可以使用DataFrame.duplicated
。
df[["C1", "C2"]].duplicated()
它將檢查行方式的唯一性。 您可以再次使用any
來檢查返回的值是否為True
。
給定2列,比如C1
和C2
,檢查每列是否包含重復值,我們可以使用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.