我有下面的xlsx表作为输入,我想用pandas获得输出. 现在我使用openpyxl,但是文件有8k行,200+ col,所以我使用的代码效率不高,运行时间超过20分钟. 示例中所示的文件也有NaN和空单元格,我想只修改不空的单元格. 如代码所示,此代码块必须从第2列和第5行到文件结尾.

# input
            Main_col        0    1    2
0  cas1 1_05.04.2024 16:40  A    B   
1  cas2 5_05.04.2024 16:41       C   
2  cas3 4_05.04.2024 17:30  D         E
# output
            Main_col                    0                          1                        2
0  cas1 1_05.04.2024 16:40  A_05.04.2024 16:40.cas1 1  B_05.04.2024 16:40.cas1 1                    
1  cas2 5_05.04.2024 16:41                             C_05.04.2024 16:41.cas2 5                    
2  cas3 4_05.04.2024 17:30  D_05.04.2024 17:30.cas3 4                            E_05.04.2024 17:30.cas3 4

我使用的代码如下.

for colonn in range(2,ws.max_column+1):
    #print("Elaboro colonna: " + str(colonn))
    for rig in range(5,ws.max_row+1):
        ValoreCell = str(ws.cell(rig,colonn).value)
        Valoreheader = str(ws.cell(rig,1).value)
        if ValoreCell != None and ValoreCell != " ":
            if "_" in ValoreCell:
                Valoreheader = Valoreheader.split("_")[0]
                #print("Valoreheader " + str(Valoreheader))
                Valor = ws.cell(rig,colonn).value
                ws.cell(rig,colonn).value = str(Valor) + "." + str(Valoreheader)

我是stackoverflow的新手

使用Pandas 在性能上的重大改进

推荐答案

您可以构建一个掩码,将Main_col字符串修改为str.replace,并使用boolean indexingadd来连接字符串:

# identify NaN/empty cells
mask = df.fillna('').ne('')
# exclude Main_col from mask
mask['Main_col'] = False

# reorder the "casX n_YYY" into "_YYY.casX n"
s = df['Main_col'].str.replace(r'([^ ]+) (\d)(_.*)', r'\3.\1 \2', regex=True)

# concatenate strings
df[mask] = df.astype(str).add(s, axis=0)

输出:

                  Main_col                          0                          1                          2
0  cas1 1_05.04.2024 16:40  A_05.04.2024 16:40.cas1 1  B_05.04.2024 16:40.cas1 1                           
1  cas2 5_05.04.2024 16:41                             C_05.04.2024 16:41.cas2 5                           
2  cas3 4_05.04.2024 17:30  D_05.04.2024 17:30.cas3 4                             E_05.04.2024 17:30.cas3 4

timing

在8k行x 200列输入上:

374 ms ± 17.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

excluding the first N rows:

只需添加一个步骤来修改面具

# exclude first N rows
N = 3
mask.iloc[:N] = False

示例输出N=3行,输入6行:

                  Main_col                          0                          1                          2
0  cas1 1_05.04.2024 16:40                          A                          B                           
1  cas2 5_05.04.2024 16:41                                                     C                           
2  cas3 4_05.04.2024 17:30                          D                                                     E
3  cas1 1_05.04.2024 16:40  A_05.04.2024 16:40.cas1 1  B_05.04.2024 16:40.cas1 1                           
4  cas2 5_05.04.2024 16:41                             C_05.04.2024 16:41.cas2 5                           
5  cas3 4_05.04.2024 17:30  D_05.04.2024 17:30.cas3 4                             E_05.04.2024 17:30.cas3 4

Python相关问答推荐

使用GEKKO在简单DTE系统中进行一致初始化

如何根据另一列值用字典中的值替换列值

如何使用Jinja语法在HTML中重定向期间传递变量?

pyscript中的压痕问题

Pandas:将多级列名改为一级

实现自定义QWidgets作为QTimeEdit的弹出窗口

所有列的滚动标准差,忽略NaN

pandas:排序多级列

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

joblib:无法从父目录的另一个子文件夹加载转储模型

用砂箱开发Web统计分析

判断solve_ivp中的事件

dask无groupby(ddf. agg([min,max])?''''

Python全局变量递归得到不同的结果

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

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

如何将泛型类类型与函数返回类型结合使用?

如何在信号的FFT中获得正确的频率幅值

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中

如何获取包含`try`外部堆栈的`__traceback__`属性的异常