V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qazwsxkevin
V2EX  ›  Python

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

  •  
  •   qazwsxkevin · 2019-08-01 20:08:50 +08:00 · 6690 次点击
    这是一个创建于 1941 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

            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 不同而已...

    6 条回复    2019-08-02 00:25:50 +08:00
    BingoXuan
        1
    BingoXuan  
       2019-08-01 20:50:19 +08:00 via Android
    可以通过 globals()注入变量
    arrow8899
        2
    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
        3
    qazwsxkevin  
    OP
       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
        4
    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
        5
    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
        6
    widewing  
       2019-08-02 00:25:50 +08:00 via Android
    @qazwsxkevin 你和我一定有一个对 c++有什么误解。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:13 · PVG 08:13 · LAX 16:13 · JFK 19:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.