使用python

时间:2018-04-05 21:14:08

标签: python-3.x pandas

我有一个这样的数据框:

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)

enter image description here

我想要做的是,创建一个新的id变量。每当第一次出现名称(比如约翰)时,该id将等于1,对于同名的另一个出现(john),该id变量将为0.这将对数据中的所有其他名称进行。我该怎么做呢?

最终输出应该是这样的:

enter image description here

注意:如果有人知道SAS,您可以按名称对数据进行排序,然后使用first.name。

       ""if first.variable = 1 then id = 1""

首次出现同名first.name = 1.对于同名的任何其他重复出现,first.name = 0.我试图在python中复制相同的名称。

到目前为止,我已经尝试过pandas groupby和first()功能以及numpy.where(),但无法完成任何工作。任何新鲜的观点都将受到赞赏。

2 个答案:

答案 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)