使用唯一索引创建Pandas数据帧

5

我能否创建一个有唯一索引或列的数据框,类似于在mysql中创建唯一键,如果我尝试添加重复索引它将返回错误?

还是我的唯一选择是创建一个 if 语句,在将其附加到数据框之前检查值?

编辑:

看起来我的问题有点不清楚。具有唯一列的意思是我们不能在列中拥有非唯一的值。

带上

df.append(new_row, verify_integrity=True)

我们可以检查所有列,但如何仅检查一两列?

2个回答

5
您可以使用 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”追加,然后再次转置,但通常我不建议这样做,因为当列数据类型不同时,转置可能会改变数据类型。(当列数据类型不同时,转换为和从对象数组转换可能对性能有所损害)
如果您需要唯一的行索引和列索引,则也许更好的选择是将DataFrame stack,以便所有唯一的列索引级别变成行索引级别。然后您可以在重新形成的DataFrame上使用带有verify_integrity=Trueappend

这对当前情况有帮助,因为行总是唯一的。但是我认为我的问题表述不清。我所指的列是指列只能具有唯一值。我将编辑我的问题。 - user3605780

1

OP的后续问题:

使用df.append(new_row, verify_integrity=True),我们可以检查所有列,但是如何仅检查一个或两个列?

要检查只有一个列的唯一性,比如列名为value,可以尝试使用

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

这将检查此列中是否存在任何重复项。如果有重复项,则不是唯一的。


给定两列,比如C1C2,要检查是否有重复的,我们仍然可以使用DataFrame.duplicated

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

它将检查逐行唯一性。您可以再次使用any来检查返回值中是否有任何一个True

给定两列,比如 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部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接