我有一个表示唯一项目的数据框。每个项目由一组varA
,varB
和varC
唯一标识(因此每个项目的varA
,varB
或0的n值均为0 varC
)。我的df每个唯一商品都有多个原始数据,包含varA
,varB
和varC
的各种组合。
df是这样的(ID
在列中是唯一的,但它并不代表唯一的项目。)
df = pd.DataFrame({'ID':[1,2,3,4,5],
'varA':['a', 'd', 'a', 'm','Z'],
'varB':['b', 'e', 'k', 'e',NaN],
'varC':['c', 'f', 'l', NaN ,'t']})
所以在这里的df,你可以看到:
我想识别每个独特的项目,给他们一个唯一的ID,并存储他们的信息。
我写的代码非常低效:
varA
,varB
或varC
。所以非常丑陋,我连续合并任一变量,并找到唯一的id。这适用于varA
和varB
条目中的20,000行。这在100,000行之前运行非常慢并且在结束之前(在Step1和Step2之间)死亡,我需要在1,000,000行上进行。
任何pandanique方式这样做?
答案 0 :(得分:1)
您可以使用duplicated
(pd.Series.duplicated)使用链式布尔索引:
如果您想保留重复的第一次出现:
myfilter = ~df.varA.duplicated(keep='first') & \
~df.varB.duplicated(keep='first') & \
~df.varC.duplicated(keep='first')
如果你不想
myfilter = ~df.varA.duplicated(keep=False) & \
~df.varB.duplicated(keep=False) & \
~df.varC.duplicated(keep=False)
然后你可以举例说明增量uniqueID:
df.ix[myfilter, 'uniqueID'] = np.arange(myfilter.sum(), dtype='int')
df
ID varA varB varC uniqueID
0 1 a b c 0.0
1 2 d e f 1.0
2 3 a k l NaN
3 4 m e NaN NaN
4 5 Z NaN t 2.0