2016-10-10 49 views
1

值的实例数量熊猫据帧列假设你有以下信息的熊猫柱:有效地创建一个包含另一列

>> df 
    num 
0 0 
1 1 
2 1 
3 2 
4 3 
5 3 

列到左边的NUM列是索引栏。 我想创建一个实例列,告诉我哪个num实例出现。这是结果,我想:

>> df 
    num instance 
0 0 1 
1 1 1 
2 1 2 
3 2 1 
4 3 1 
5 3 2 

下面是我写这样做代码:

>> my_list = [] 
>> for index, row in df.iterrows(): 
>> my_list.append(df.loc[index,'num']) 
>> # The IF condition is done to prevent my_list from growing too big. 
>> if len(my_list)>1: 
>>  if my_list[len(my_list)-1] == my_list[len(my_list)-2]: 
>>   del my_list[:len(my_list)-2] 
>> my_list['instance'] = len([element for element in my_list if \ 
           element == df.loc[index,'num']) 

该代码完全适用于小DataFrames,但它需要的时间如愿长量数字列由几百万行组成时完成。有没有办法创建实例列的方式,我想在不使用.iterrows()?

+0

你能描述一下你所说的 “实例” 是什么意思?这对我来说并不明显,即使看着你的代码。 –

回答

1

试试这个:

In [11]: df['instance'] = df.groupby('num').cumcount()+1 

In [12]: df 
Out[12]: 
    num instance 
0 0   1 
1 1   1 
2 1   2 
3 2   1 
4 3   1 
5 3   2 
+0

这正是我想到的。我将不得不重新审查GroupBy中的功能。 – Xavier

0

你可以groupby上 'NUM' 列,并呼吁rank与PARAM method=dense'

In [5]: 
df['instance'] = df.groupby('num').transform(lambda x: x.rank(method='dense')) 
df 

Out[5]: 
    num instance 
0 0   1 
1 1   1 
2 1   2 
3 2   1 
4 3   1 
5 3   2 
相关问题