Python 高效地创建包含另一列中某个值的实例号的DataFrame列
假设您有一列包含以下信息:Python 高效地创建包含另一列中某个值的实例号的DataFrame列,python,pandas,dataframe,Python,Pandas,Dataframe,假设您有一列包含以下信息: >> 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 以下是我编写的代码: >>
>> 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'])
这段代码非常适用于小数据帧,但是当num列由几百万行组成时,它需要花费非常长的时间才能完成。有没有一种方法可以不使用.iterrows()而按照我的想法创建实例列?试试以下方法:
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
您可以在'num'列上使用
groupby
,并使用parammethod=densed'调用:
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
你能描述一下你所说的“实例”是什么意思吗?这对我来说并不明显,甚至从你的代码来看。这正是我所想的。我将不得不重新检查GroupBy中的功能。