我有一个这样的数据框:
d = {'name': ['john', 'john', 'john', 'Tim', 'Tim', 'Tim','Bob', 'Bob'], 'Prod': ['101', '102', '101', '501', '505', '301', '302', '302'],'Qty': ['5', '4', '1', '3', '5', '4', '1', '3']}
df = pandas.DataFrame(data= d)
我想要做的是,创建一个新的id变量。每当第一次出现名称(比如约翰)时,该id将等于1,对于同名的另一个出现(john),该id变量将为0.这将对数据中的所有其他名称进行。我该怎么做呢?
最终输出应该是这样的:
注意:如果有人知道SAS,您可以按名称对数据进行排序,然后使用first.name。
""if first.variable = 1 then id = 1""
首次出现同名first.name = 1.对于同名的任何其他重复出现,first.name = 0.我试图在python中复制相同的名称。
到目前为止,我已经尝试过pandas groupby和first()功能以及numpy.where(),但无法完成任何工作。任何新鲜的观点都将受到赞赏。
答案 0 :(得分:3)
您可以使用cumcount
s=df.groupby(['Prod','name']).cumcount().add(1)
df['counter']=s.mask(s.gt(1),0)
df
Out[1417]:
Prod Qty name counter
0 101 5 john 1
1 102 4 john 1
2 101 1 john 0
3 501 3 Tim 1
4 505 5 Tim 1
5 301 4 Tim 1
6 302 1 Bob 1
7 302 3 Bob 0
更新:
s=df.groupby(['name']).cumcount().add(1).le(1).astype(int)
s
Out[1421]:
0 1
1 0
2 0
3 1
4 0
5 0
6 1
7 0
dtype: int32
更快
df.loc[df.name.drop_duplicates().index,'counter']=1
df.fillna(0)
Out[1430]:
Prod Qty name counter
0 101 5 john 1.0
1 102 4 john 0.0
2 101 1 john 0.0
3 501 3 Tim 1.0
4 505 5 Tim 0.0
5 301 4 Tim 0.0
6 302 1 Bob 1.0
7 302 3 Bob 0.0
答案 1 :(得分:1)
我们可以直接使用您的词典d并循环创建一个新条目。
d = {'name': ['john', 'john', 'john', 'Tim', 'Tim', 'Tim','Bob', 'Bob'], 'Prod': ['101', '102', '101', '501', '505', '301', '302', '302'],'Qty': ['5', '4', '1', '3', '5', '4', '1', '3']}
names = set() #store names that have appeared
id = []
for i in d['name']:
if i in names: #if it appeared add 0
id.append(0)
else:
id.append(1) #add 1 and note that it has appeared
names.add(i)
d['id'] = id #add entry to your dictionary
df = pandas.DataFrame(data= d)