创建一个基于Python中另一列递增的列

时间:2012-10-23 13:41:53

标签: python r pandas data.table

我目前已将注意力从R转移到Python。我在R中使用data.table,我发现有时很难找到Python中某些函数的等价物。

我有一个像这样的pandas数据框:

  

df = pd.DataFrame({' A':[' abc',' def',' def',' ; abc',' def',' def',' abc'],' B':[13123,45,1231, 463,142131,4839,4341]})

     
     A       B  
0  abc   13123    
1  def      45  
2  def    1231  
3  abc     463  
4  def  142131  
5  def    4839
6  abc    4341
  

我需要根据A和B创建一个从1开始递增的列,以便它表示B的递增顺序。所以我首先创建排序数据框,而我对创建感兴趣的列是C如下:

    A       B   C
1  abc     463  1
6  abc    4341  2
0  abc   13123  3
3  def      45  1
2  def    1231  2
5  def    4839  3
4  def  142131  4

在R中,使用库(data.table),可以在一行中轻松完成,并在原始数据表中创建一列:

  

df [,C:= 1:.N,by = A]

我环顾四周,我想我可以使用这样的东西:

  

df.groupby(' A&#39)尺寸()
。   或
  DF [' B&#39]。argsort()

但不确定如何从这里开始,以及如何将新列连接回原始数据框。如果有人能给我任何指针,那将是非常有帮助的。

非常感谢!

3 个答案:

答案 0 :(得分:4)

In [61]: df
Out[61]:
     A       B
1  abc     463
6  abc    4341
0  abc   13123
3  def      45
2  def    1231
5  def    4839
4  def  142131

In [62]: df['C'] =  df.groupby('A')['A'].transform(lambda x: pd.Series(range(1, len(x)+1), index=x.index))

In [63]: df
Out[63]:
     A       B  C
1  abc     463  1
6  abc    4341  2
0  abc   13123  3
3  def      45  1
2  def    1231  2
5  def    4839  3
4  def  142131  4

答案 1 :(得分:1)

为了进行比较,正确的data.table语法是:

df[, C := 1:.N, by=A]

这会通过引用df添加新列C. :=运算符是R的data.table包的一部分。它允许您添加和删除列,并按组分配给data.table的子集,通过引用分配,完全没有副本。

答案 2 :(得分:0)

索引魔术似乎是另一种方式:

df['C']=df.sort(['A','B'],inplace=True).groupby('A').reset_index().index.labels[1]