请教一个 Python 技巧(批量对 pandas.DataFrame()统一修改列名)

2019-08-01 20:08:50 +08:00
 qazwsxkevin

首先,我搞了个这样的事:

        pdTable1 = pd.DataFrame()
        pdTable2 = pd.DataFrame()
        pdTable3 = pd.DataFrame()
        pdTable4 = pd.DataFrame()
        pdTable5 = pd.DataFrame()
        pdTable6 = pd.DataFrame()

然后我弄了个事,把这 6 个 df 都放了内容,要进行统一改列名,原本我是这么做的:

        pdTable1.rename(columns={
            'A': 'AA',
            'B': 'BBB',
            'C': 'CC',
            'D': 'DDD',
            'E': 'EE',
            'F': 'FFF',
            'G': 'GG',
            'H': 'HHH',
            'I': 'II',
            'J': 'JJJ',
            'K': 'KK',
        }, inplace=True)

有多少 df,代码就写满多少个......,能完成达到目标就好,其它不管了
df 增多了,列名又要变化的时候,就觉得这是个事了...
但小弟对 python 是辅助工具态度,不是饭碗态度(我不能算是职业程序员),没有过于深入了解基本功,
所以想请教一下大神们,我觉得应该是可以做一个循环,来批量处理么? for?? 还是有更高阶的套路?
每个 df 变量名之间的区别,最后 1、2、3、4、5、6...N 不同而已...

6690 次点击
所在节点    Python
6 条回复
BingoXuan
2019-08-01 20:50:19 +08:00
可以通过 globals()注入变量
arrow8899
2019-08-01 21:04:12 +08:00
```
for key in list(locals().keys()):
if key.startswith('pdTable'):
locals()[key].rename(columns={'old_name': 'new_name'})
```
但是,你为什么需要这样写呢
qazwsxkevin
2019-08-01 23:38:16 +08:00
@BingoXuan 第一次知道 globals(),马上准备去学习。。。

@arrow8899,这样写,各个分支的 pd 容易管理处理吧,
以前有学习过 C++的内容,好像变量名也可以使用变量,C++的伪代码:

```
aa1 = 1;
aa2 = 2;
aa3 = 3;

for (i=0,i <=3,i++)
cout << "aa" << str.format[i] << "is:" << aai
```
输出:
1
2
3
这样子
不知道 python 是否有技巧可以做到这样?
gsj987
2019-08-01 23:47:35 +08:00
@qazwsxkevin 就是循环生成规律变量名的变量并赋值是吗?就用反射好了

方法 1,对当前 module/class 使用 setattr
```
>>>import sys
>>>thismodule = sys.modules[__name__]
>>>setattr(thismodule, 'table1', 1)
>>> table1
1
```

方法 2,使用 vars()或者 2L 说的 globals() #前者是当前 module,后者是全局
```
>>> vars()['table2']=2
>>> table2
2
```
Vinty
2019-08-01 23:49:57 +08:00
你是不是需要一个 df 的 list
dfs = [pd.Dataframe() for i in range(n)]

对 list 的元素批量操作可以用 map
rename_col = lambda x: x.rename(columns={ 'A': 'AA', }, inplace=True)
map(rename_col, dfs)
widewing
2019-08-02 00:25:50 +08:00
@qazwsxkevin 你和我一定有一个对 c++有什么误解。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/588324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX