Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 高效地创建包含另一列中某个值的实例号的DataFrame列_Python_Pandas_Dataframe - Fatal编程技术网

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
,并使用param
method=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中的功能。