是否可以将方法链中间的数据帧复制到新变量中? 类似于:

import pandas as pd

df = (pd.DataFrame([[2, 4, 6],
                    [8, 10, 12],
                    [14, 16, 18],
                    ])
      .assign(something_else=100)
      .div(2)
      .copy_to_new_variable(df_imag)  # Imaginated method to copy df to df_imag.
      .div(10)
      )

然后print(df_imag)会返回:

    0   1   2   something_else
0   1.0 2.0 3.0 50.0
1   4.0 5.0 6.0 50.0
2   7.0 8.0 9.0 50.0

.copy_to_new_variable(df_imag)可以被df_imag = df.copy()取代,但这会导致方法链受损.

推荐答案

动态创建变量is not a good idea,但您可以轻松地利用字典等可变对象.

添加新的DataFrame方法以无缝完成此操作:

from pandas.core.base import PandasObject

### this only needs to be done once per session
def to_name(df, dic, name, copy=False):
    dic[name] = df.copy() if copy else df
    return df
    
PandasObject.to_name = to_name
###

tmp = {}

df = (pd.DataFrame([[2, 4, 6],
                    [8, 10, 12],
                    [14, 16, 18],
                    ])
      .assign(something_else=100)
      .div(2)
      .to_name(tmp, 'after_div2', copy=True)
      .div(10)
      )

print(tmp['after_div2'])

print(df)

输出:

# tmp['after_div2']
     0    1    2  something_else
0  1.0  2.0  3.0            50.0
1  4.0  5.0  6.0            50.0
2  7.0  8.0  9.0            50.0

# df
     0    1    2  something_else
0  0.1  0.2  0.3             5.0
1  0.4  0.5  0.6             5.0
2  0.7  0.8  0.9             5.0

如果不想用猴子修补DataFrame对象,请使用pipe:

def to_name(df, dic, name, copy=False):
    dic[name] = df.copy() if copy else df
    return df

tmp = {}

df = (pd.DataFrame([[2, 4, 6],
                    [8, 10, 12],
                    [14, 16, 18],
                    ])
      .assign(something_else=100)
      .div(2)
      .pipe(to_name, tmp, 'after_div2')
      .div(10)
      .pipe(lambda df: print('\nQuick alternative:', df, sep='\n') or df)
      )

print(tmp['after_div2'])

印刷

在同一行中,您还可以添加一个可链接的print方法,或再次使用pipe中的lambda:

from pandas.core.base import PandasObject

### this only needs to be done once per session
def df_print(df, *args):
    if args:
        print(*args)
    print(df)
    return df
    
PandasObject.print = df_print
###

df = (pd.DataFrame([[2, 4, 6],
                    [8, 10, 12],
                    [14, 16, 18],
                    ])
      .print()
      .assign(something_else=100)
      .div(2)
      .print('\nAfter 2:')
      .div(10)
      .pipe(lambda df: print('\nQuick alternative:', df, sep='\n') or df)
      )

输出:

    0   1   2
0   2   4   6
1   8  10  12
2  14  16  18

After 2:
     0    1    2  something_else
0  1.0  2.0  3.0            50.0
1  4.0  5.0  6.0            50.0
2  7.0  8.0  9.0            50.0

Quick alternative:
     0    1    2  something_else
0  0.1  0.2  0.3             5.0
1  0.4  0.5  0.6             5.0
2  0.7  0.8  0.9             5.0

作为一个模块

您还可以:

pandas_debug.py

from pandas.core.base import PandasObject

def df_print(df, *args):
    if args:
        print(*args)
    print(df)
    return df
    
PandasObject.print = df_print

def to_name(df, dic, name, copy=False):
    dic[name] = df.copy() if copy else df
    return df

PandasObject.to_name = to_name

然后在您的代码中:

import pandas as pd
import pandas_debug

tmp = {}
df = (pd.DataFrame([[2, 4, 6],
                    [8, 10, 12],
                    [14, 16, 18],
                    ])
      .assign(something_else=100)
      .div(2)
      .to_name(tmp, 'after_div2')
      .div(10)
      .print()
      )

Python相关问答推荐

Pandas .类型错误:只能将字符串(而不是int)连接到字符串

取相框中一列的第二位数字

按日期和组增量计算总价值

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

无法使用equals_html从网址获取全文

如何使用Google Gemini API为单个提示生成多个响应?

点到面的Y距离

Odoo 14 hr. emergency.public内的二进制字段

抓取rotowire MLB球员新闻并使用Python形成表格

如何避免Chained when/then分配中的Mypy不兼容类型警告?

沿着数组中的轴计算真实条目

scikit-learn导入无法导入名称METRIC_MAPPING64'

运行终端命令时出现问题:pip start anonymous"

如何获取TFIDF Transformer中的值?

通过pandas向每个非空单元格添加子字符串

Python,Fitting into a System of Equations

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

在pandas中使用group_by,但有条件

Geopandas未返回正确的缓冲区(单位:米)

如何在海上配对图中使某些标记周围的黑色边框