有效地创建Pandas DataFrame列,其中包含另一列中值的实例编号

时间:2016-10-10 22:14:40

标签: python pandas dataframe

假设您有一个Pandas列,其中包含以下信息:

>> 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'])

此代码适用于小型DataFrame,但当num列由数百万行组成时,需要花费很长的时间才能完成。有没有办法以我正在考虑的方式创建实例列而不使用.iterrows()?

2 个答案:

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

答案 1 :(得分:0)

您可以在{num'列上groupby并使用参数method=dense'致电rank

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