2017-09-18 77 views
1

假设我有以下大熊猫数据帧,DF1,在从Excel文件一个jupyter笔记本:标记重复

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以前的单元格包含相同的项目,打印dup(重复)的STAT;否则,不要放任何东西。在我的例子的上方,用户2,3和5应我的操作之后具有在SRCdup

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

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

这工作得很好,但我想知道

一),如果它可以提高

和更重要的是

乙)为什么它抛出一个A value is trying to be set on a copy of a slice from a DataFrame警告尽管使用.IX我。即使.loc也会抛出警告。

这将是很容易检查一般,但我使用jupyter笔记本PyCharm,每次我重新加载该文件时,我得到的代码_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', "") 
+0

在'Name'列值排序? – jezrael

+0

是的。事实上,他们被称为SRC的另一列按照名称排序后取值A或B。我选择不包含这些信息。 –

回答

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 
+0

好吧,再次,这工作,并比我的解决方案更快,但它仍然会引发同样的警告。 –

+0

您是如何生成数据框的?如果它没有使用.copy()生成,则会导致复制警告。 – Vaishali

+0

我没有使用.copy(),因为我被告知这从来不是生成数据框的正确方法。这是无稽之谈吗? –

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 
+0

我想,OP只想检查以前的值,而不是所有框架中的重复。 – Zero

+0

这是可能的,但如果值排序,这也应该工作。 – jezrael

+0

我的意思是,只有当值被排序时,这才有效,但我不确定OP是否在任何地方说过。 – Zero