当索引可能相同时,检查panda数据帧的条目是否唯一

时间:2017-06-05 23:25:58

标签: python pandas

我有一个想要添加行的熊猫DataFrame。 Dataframe看起来像这样:

   col1  col2
a     1     5
b     2     6
c     3     7

我想在数据框中添加行,但前提是它们是唯一的。问题是某些新行可能具有相同的索引,但列中的值不同。如果是这种情况,我需要知道。

要添加的一些示例行和所需的结果:

第1行:

   col1  col2
a     1     5

所需的第1行结果:未添加 - 它已经在数据框中

第2行:

   col1  col2
a     9     9

期望的第2行结果:类似,

print('non-unique entries for index a')

第3行:

   col1  col2
d     4     4

所需的第3行结果:只需将行添加到数据框中。

2 个答案:

答案 0 :(得分:0)

试试这个:

# existing dataframe == df
# new rows == df_newrows

# dividing newrows dataframe into two, one for repeated indexes, one without.

df_newrows_usable = df_newrows.loc[df_newrows.index.isin(list(df.index.get_values()))==False]
df_newrows_discarded = df_newrows.loc[df_newrows.index.isin(list(df.index.get_values()))]

print ('repeated indexes:', df_newrows_discarded)

# concat df and newrows without repeated indexes

new_df = pd.concat([df,df_newrows],0)

print ('new dataframe:', new_df)

答案 1 :(得分:0)

简单的选项是合并所有行,然后通过数据帧方法保留唯一的行drop_duplicates

但是,当附加重复行时,此选项不会报告警告/错误。

drop_duplicates不考虑索引,因此必须在删除重复项之前重置数据帧,并在之后重新设置:

import pandas as pd
# set up data frame
df = pd.DataFrame({'col1': [1, 2, 3], 'col2':[5, 6, 7]}, index=['a', 'b', 'c'])
# set up row to be appended
row = pd.DataFrame({'col1':[3], 'col2': [7]}, index=['c'])
# append row (don't care if it's duplicate)
df = df.append([row])
# drop duplicatesdf2 = df2.reset_index()
df2 = df2.drop_duplicates()
df2 = df2.set_index('index')

如果警告消息是绝对要求,我们可以编写一个函数来检查行是否通过合并操作重复,并仅在行唯一时附加行。

def append_unique(df, row):
    d = df.reset_index()
    r = row.reset_index()
    if d.merge(r, on=list(d.columns), how='inner').empty:
        d2 = d.append(r)
        d2 = d2.set_index('index')
        return d2
    print('non-unique entries for index a')
    return df

df2 = append_unique(df2, row)