更有效地执行嵌套python循环

更有效地执行嵌套python循环,python,pandas,dataframe,Python,Pandas,Dataframe,我在这里看过其他解释,但都不太合适。 解包代码可以工作,但速度非常慢。有没有更好的方法可以用于python。我看不出我怎么能在这里工作。 任何建议都会很有帮助 import pandas as pd df = pd.DataFrame(data={'a':['A1 + A3','B4 + A4 + D2','C2 + D2'],'b':['L700 + L800','G700','L2600 + L900'],'c':['6','7','8']}) df a

我在这里看过其他解释,但都不太合适。 解包代码可以工作,但速度非常慢。有没有更好的方法可以用于python。我看不出我怎么能在这里工作。 任何建议都会很有帮助

import pandas as pd

df = pd.DataFrame(data={'a':['A1 + A3','B4 + A4 + D2','C2 + D2'],'b':['L700 + 
          L800','G700','L2600 + L900'],'c':['6','7','8']})
df

    a   b   c
0   A1 + A3 L700 + L800     6
1   B4 + A4 + D2    G700    7
2   C2 + D2 L2600 + L900    8

使用:

说明

  • 第一个用于拆分的拆分列
  • 使用
    多索引对
    系列
    进行重塑
  • 通过正则表达式为每行创建
    DataFrame
    -nees escape
    ++
    ,对于一个或多个空格,使用
    \s+
  • 根据和将第二个标高的形状重塑为柱
  • 通过
    ffill向前填充
    NaN
    s
  • 数据清理
  • 如果列的顺序很重要,请添加

  • 欢迎来到StackOverflow。请花点时间阅读这篇文章,以及如何提供答案,并相应地修改你的问题。这些提示可能也很有用。可以吗?我希望输出看起来更好。它是超级的,谢谢。@Martintoma-我开始做它,但是有很多功能,所以我希望在3分钟内它会是done@MartinThoma-好了,哇!谢谢你,耶斯雷尔!我得一行一行地检查一下。我原以为我已经掌握了python(老VBA大师)的诀窍,但你已经告诉我,我还有很多路要走。@jezrael-当我在代码中运行这个时,我得到了“ValueError:Index包含重复的条目,无法重塑”我正在使用的df比我上面的示例有更多的列。我应该寻找什么来尝试修复此问题?@jezrael-我通过创建一个唯一的索引df['new']=range(1,len(df.index)+1)来修复它,因为我的数据帧不包含任何唯一的valuecolumns:)
    df2 = pd.DataFrame(columns = df.columns)
    for index, row in df.iterrows():
        userLabel = row.loc['a']
        cells = userLabel.split('+') 
    
        ID = row.loc['b']
        tech = ID.split('+')     
        i = 0
        for cell in cells:
    
            cell = cell.strip()
            row.loc['a'] = cell
            if i > len(tech)-1:
                i = i-1
            row.loc['b'] = tech[i]
            df2.loc[len(df2)] = row
            i += 1
    
    df2
    
        a   b   c
    0   A1  L700    6
    1   A3  L800    6
    2   B4  G700    7
    3   A4  G700    7
    4   D2  G700    7
    5   C2  L2600   8
    6   D2  L900    8
    
    df = (df.set_index('c')
            .stack()
            .str.split('\s+\+\s+', expand=True)
            .stack()
            .unstack(1)
            .ffill()
            .reset_index(level=1, drop=True)
            .reset_index()
            .reindex(columns=['a','b','c'])
            )
    print (df)
        a      b  c
    0  A1   L700  6
    1  A3   L800  6
    2  B4   G700  7
    3  A4   G700  7
    4  D2   G700  7
    5  C2  L2600  8
    6  C2   L900  8