6

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

我有一个看起来像这样的熊猫数据框:

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 中,使用 library(data.table),这可以很容易地在一行中完成,并在原始数据表中创建一个列:

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

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

df.groupby('A').size()

df['B'].argsort()

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

非常感谢!

4

3 回答 3

6
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
于 2012-10-23T14:17:06.900 回答
1

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

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

这通过引用添加了一个新列dfC。该:=运算符是data.tableR 包的一部分。它允许您添加和删除列,并按data.table组、按引用分配给 的子集,根本没有副本。

于 2012-10-23T14:35:22.143 回答
0

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

df['C']=df.sort(['A','B'],inplace=True).groupby('A').reset_index().index.labels[1]
于 2012-10-23T14:57:02.117 回答