在pandas中同时重命名和选择列

4

我一直在尝试使用pandas选择列并将其重命名。在R的dplyr中,这很直接,但当涉及到pandas时,我找不到方法。

例如:

import numpy as np
import pandas as pd
np.random.seed(128)

df = pd.DataFrame(np.random.random((5,7)), index=pd.Series(range(1,6), name="week"))
df

             0         1         2    ...            4         5         6
week                                  ...                                 
1     0.866637  0.263145  0.131408    ...     0.238924  0.645475  0.790599
2     0.601442  0.334299  0.119428    ...     0.109724  0.602113  0.251285
3     0.299681  0.517116  0.715203    ...     0.102088  0.706524  0.985842
4     0.559079  0.592019  0.741931    ...     0.125672  0.907613  0.573170
5     0.731224  0.301214  0.066628    ...     0.133776  0.655933  0.423496

然后尝试更改一些列名

df.rename(columns={0 : "L",1 : "W",2 : "C1",3 : "C2"},inplace=True)

必须选择感兴趣的列

df.loc[:,'L','C2',4:6] 

但是遇到以下代码

df.loc[:,['L','C2',4:6]]

SyntaxError: 无效的语法

使用 R 的 dplyr 只需要一行代码即可。

select(L=0,W=1,C1=2,4:max(ncol(.))

为什么Pandas不直观,如何用Pandas做同样的事情?

预期输出应该如下所示:

week                 L                        C2                      4                  5                   6
1   0.8666370428503979      0.041593443747687364    0.23892433469051455 0.6454746004955415  0.7905993520222332
2   0.6014424381923764      0.30913305250605294     0.10972378522258008 0.6021133114626169  0.25128495916256977
3   0.2996812876134075      0.9314494030471506      0.1020881539666203  0.7065238642131539  0.9858423635165023
4   0.5590790688036144      0.8212812049578435      0.12567153920750518 0.9076131583950552  0.5731702972368342
5   0.7312243453837555      0.16307047811396225     0.13377623506787528 0.6559325420882364  0.4234963284022535

你期望的输出是什么? - Ankur Sinha
@AnkurSinha 你好,请检查OP的结尾! - Alexander
df[['L', 'C2', 4, 5, 6]] 应该可以用,不是吗?或者你是在寻找 pandas 中 4:6 的等效方式? - Ankur Sinha
@AnkurSinha 你的意思是 df.loc[:,['L', 'C2', 4, 5, 6]] 可以工作,但是 df.loc[:,['L', 'C2', 4: 6]] 不行!我不想明确指出最大列数(第六列),因为在每个数据中我可能不知道最大列值,但我知道起始列值。 - Alexander
2个回答

2

另外,您可以使用.iloc

最初的回答

df.iloc[:, np.r_[0, 3, 4:len(df.columns)]]

只是想澄清一下,iloc不能同时帮助重命名和选择列,但是根据您的示例,我发现它更接近于select。此外,与 R / R 库的比较 - pandas 0.25.0 文档 可能值得阅读。 - help-ukraine-now

2

IIUC, you need:

df.loc[:, ['L', 'C2'] + [i for i in range(4, len(df.columns))]]

输出:

             L        C2         4         5         6
week                                                  
1     0.156464  0.197580  0.885015  0.991281  0.478843
2     0.744064  0.082760  0.694133  0.487298  0.026765
3     0.371953  0.015918  0.494651  0.965285  0.348584
4     0.528609  0.287760  0.788897  0.664366  0.094318
5     0.316789  0.211593  0.921653  0.005872  0.174702

解释:

你要找的部分是:

[i for i in range(4, len(df.columns))]

"最初的回答" - 这给出了:
[4, 5, 6]

接下来,就是关于在Python中添加列表的操作:

最初的回答:

['L', 'C2'] + [i for i in range(4, len(df.columns))]

只有一件事。我在想这个能不能用一行代码完成?就像你已经重命名了L和C2列,在第二行中我们选择了它们。但是在R中,可以只用一行代码完成 select(L=0,W=1,C1=2,4:max(ncol(.))。这种操作在pandas中是否可行? - Alexander
for loop 前面的 i 代表什么? - Alexander
select(L=0,W=1,C1=2,4:max(ncol(.)) <- R 不是我的强项,但这样不会返回重命名后的整个数据框,而只会返回你所要求的特定列 L, C2, 4, 5, 6,对吗? - Ankur Sinha
那里的i是每次迭代中i的值,但将整个内容放在[..]中意味着最终结果是一个list,这正是您想要的。您通常会编写类似于for i in 1:4 print(i)然后是newList.append(i)的伪代码循环,但在Python中,您有列表推导式的概念,其中您将其编写为[i for i in range(1, 4)],例如它会自动以一行返回值列表。 - Ankur Sinha
也许你可以在这里看到一个很好的例子,因为我可能没有在评论中解释清楚。https://www.geeksforgeeks.org/python-list-comprehension-and-slicing/。如果你仍然有疑问,我会尽力为你澄清。 - Ankur Sinha
好的,我想我明白了关于“i for i in ....”这部分。谢谢!抱歉,我输错了select(L=0,C2=3,4:max(ncol(.)))。所以它没有给出整个数据。 - Alexander

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