Pandas中与dplyr everything()函数等价的函数是什么?

7

在R中,我经常使用dplyrselecteverything()相结合。

df %>% select(var4, var17, everything())

以上示例将重新排列数据框的列,使var4成为第一列,var17成为第二列,随后列出所有剩余的列。最符合Pandas惯例的做法是什么?当涉及到许多列时,明确列名并跟踪它们的位置非常繁琐。理想的解决方案应该简短易读,并且可以用于pandas链式操作。
2个回答

5
使用Index.difference来查找出所有未在列表中指定的值并将它们连接到一起:
df = pd.DataFrame({
        'G':list('abcdef'),
         'var17':[4,5,4,5,5,4],
         'A':[7,8,9,4,2,3],
         'var4':[1,3,5,7,1,0],
         'E':[5,3,6,9,2,4],
         'F':list('aaabbb')
})

cols = ['var4','var17']
another = df.columns.difference(cols, sort=False).tolist()
df = df[cols + another]
print (df)
   var4  var17  G  A  E  F
0     1      4  a  7  5  a
1     3      5  b  8  3  a
2     5      4  c  9  6  a
3     7      5  d  4  9  b
4     1      5  e  2  2  b
5     0      4  f  3  4  b

编辑:如果要进行链式操作,可以使用DataFrame.pipe并传递DataFrame

def everything_after(df, cols):
    another = df.columns.difference(cols, sort=False).tolist()
    return df[cols + another]

df = df.pipe(everything_after, ['var4','var17']))
print (df)
   var4  var17  G  A  E  F
0     1      4  a  7  5  a
1     3      5  b  8  3  a
2     5      4  c  9  6  a
3     7      5  d  4  9  b
4     1      5  e  2  2  b
5     0      4  f  3  4  b

1
换句话说,有没有一种方法将其定义为函数并在必要时重复使用。即定义一个 everything_after(var4, var17) 来获得上面的输出。 - safex
1
太好了!这会成为pandas一个不错的功能请求,但我会把它留给专业人士... - safex
1
@SAFEX - 不是这样的,需要使用everything_after(df.query('A > 3'), ['var4','var17']) - jezrael
1
嗯,我明白了。为了尽可能地模仿dplyr的行为,我更喜欢另一种方式。我正在尝试使用.pipe来使它正常工作,但目前还没有成功。 - safex
2
对于pipe,您不需要使用lambda,只需使用df.pipe(everything_after, ["var4","var17"])即可。 - sammywemmy
显示剩余2条评论

3
现在,您可以使用 datar 让它更加顺畅!
>>> from datar import f
>>> from datar.datasets import iris
>>> from datar.dplyr import select, everything, slice_head
>>> iris >> slice_head(5)
   Sepal_Length  Sepal_Width  Petal_Length  Petal_Width Species
0           5.1          3.5           1.4          0.2  setosa
1           4.9          3.0           1.4          0.2  setosa
2           4.7          3.2           1.3          0.2  setosa
3           4.6          3.1           1.5          0.2  setosa
4           5.0          3.6           1.4          0.2  setosa
>>> iris >> select(f.Species, everything()) >> slice_head(5)
  Species  Sepal_Length  Sepal_Width  Petal_Length  Petal_Width
0  setosa           5.1          3.5           1.4          0.2
1  setosa           4.9          3.0           1.4          0.2
2  setosa           4.7          3.2           1.3          0.2
3  setosa           4.6          3.1           1.5          0.2
4  setosa           5.0          3.6           1.4          0.2

我是该软件包的作者。如果您有任何问题,请随时提交问题反馈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接