使用pandas在单独的列中标记重复项

时间:2017-09-18 04:46:08

标签: python python-3.x pandas jupyter-notebook

假设我在excel文件的jupyter笔记本中有以下pandas数据框df1:

Name    ID      Password
A       User_1  PW_1
A       User_2  PW_2
A       User_3  PW_3
B       User_4  PW_4
B       User_5  PW_5
C       User_6  PW_6

我想添加一个名为STAT的新列,该列遍历Name列,Name中的每个项目,如果Name中的上一个单元格{1}}包含相同的项目,在dup中打印STAT(重复);否则,不要放任何东西。在上面的示例中,用户2,3和5在我的操作后应该在dup列中有SRC

这是我的尝试。我使用STAT添加了一个名为df1.insert的新空白列,然后运行:

for index, name in enumerate(df1['Name']):
    if index > 0:
        if df1['Name'][index - 1] == name:
            df1.ix[index, 'STAT'] = 'dup'`

这很好,但我想知道

a)是否可以改进

更重要的是

b)尽管我使用.ix,为什么它会发出A value is trying to be set on a copy of a slice from a DataFrame警告。即使.loc也会发出警告。

通常很容易检查,但是我在PyCharm中使用了jupyter笔记本,每次重新加载文件时都会得到_xrsf argument missing from POST.

相关的代码片段,适用于我的实际示例。 df名称会有所不同:

sort_full = full_set.sort_values(['Name','SRC'])
dupless_full = sort_full.drop_duplicates(subset = ['Name', 'ER', 'ID', 
'PW'], keep = 'last')
dupless_full.reset_index(drop = True, inplace = True)

dupless_full['STAT'] = np.where(dupless_full['Name'] == 
dupless_full['Name'].shift(), 'dup', "")

2 个答案:

答案 0 :(得分:4)

您可以使用np.where

df1['Stat'] = np.where(df['Name'] == df['Name'].shift(), 'Dupe', np.nan)

    Name    ID      Password    Stat
0   A       User_1  PW_1        nan
1   A       User_2  PW_2        Dupe
2   B       User_3  PW_3        nan
3   C       User_4  PW_4        nan

答案 1 :(得分:0)

如果对列Name中的值进行排序,则可以使用duplicated作为布尔掩码:

df1['Stat'] = np.where(df1['Name'].duplicated(), 'Dupe', '')
print (df1)
  Name      ID Password  Stat
0    A  User_1     PW_1      
1    A  User_2     PW_2  Dupe
2    B  User_3     PW_3      
3    C  User_4     PW_4    

如果未对值进行排序,我会将其与另一个answer进行比较:

df1['Stat_shift'] = np.where(df1['Name'] == df1['Name'].shift(), 'Dupe', np.nan)
df1['Stat_duplicated'] = np.where(df1['Name'].duplicated(), 'Dupe', '')
print (df1)
  Name      ID Password Stat_shift Stat_duplicated
0    A  User_1     PW_1        nan                
1    A  User_2     PW_2       Dupe            Dupe
2    B  User_3     PW_3        nan                
3    A  User_2     PW_2        nan            Dupe
4    C  User_4     PW_4        nan                
5    B  User_3     PW_3        nan            Dupe
6    B  User_3     PW_3       Dupe            Dupe