假设我在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', "")
答案 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