Pandas 相当于 dplyr everything()

SAF*_*FEX 5 r pandas dplyr

在 RI 中经常使用dplyr'sselecteverything()

df %>% select(var4, var17, everything())
Run Code Online (Sandbox Code Playgroud)

例如,上面的示例将重新排序数据帧的列,例如var4第一列,var17第二列,随后列出所有剩余的列。这样做的最熊猫方式是什么?处理许多列使得明确地将它们拼写出来并跟踪它们的位置是一件痛苦的事情。

理想的解决方案是简短、可读且可用于 Pandas 链接。

jez*_*ael 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
Run Code Online (Sandbox Code Playgroud)

编辑:对于链接可以使用DataFrame.pipepass 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
Run Code Online (Sandbox Code Playgroud)

  • 对于 ```pipe```,你不需要 lambda,:```df.pipe(everything_after, ["var4","var17"])``` 就足够了 (2认同)