假设您有一个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()?
答案 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