在R中,我经常使用dplyr
的select
和everything()
相结合。
df %>% select(var4, var17, everything())
以上示例将重新排列数据框的列,使
var4
成为第一列,var17
成为第二列,随后列出所有剩余的列。最符合Pandas惯例的做法是什么?当涉及到许多列时,明确列名并跟踪它们的位置非常繁琐。理想的解决方案应该简短易读,并且可以用于pandas链式操作。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
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
everything_after(var4, var17)
来获得上面的输出。 - safexeverything_after(df.query('A > 3'), ['var4','var17'])
- jezrael.pipe
来使它正常工作,但目前还没有成功。 - safexpipe
,您不需要使用lambda,只需使用df.pipe(everything_after, ["var4","var17"])
即可。 - sammywemmy