我能否创建一个有唯一索引或列的数据框,类似于在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])
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]
stack
,以便所有唯一的列索引级别变成行索引级别。然后您可以在重新形成的DataFrame上使用带有verify_integrity=True
的append
。OP的后续问题:
使用df.append(new_row, verify_integrity=True),我们可以检查所有列,但是如何仅检查一个或两个列?
要检查只有一个列的唯一性,比如列名为value
,可以尝试使用
df['value'].duplicated().any()
这将检查此列中是否存在任何重复项。如果有重复项,则不是唯一的。
给定两列,比如C1
和C2
,要检查是否有重复的行,我们仍然可以使用DataFrame.duplicated
。
df[["C1", "C2"]].duplicated()
any
来检查返回值中是否有任何一个True
。
给定两列,比如 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部分。