更有效地执行嵌套python循环

时间:2018-06-13 05:41:42

标签: 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   b   c
0   A1 + A3 L700 + L800     6
1   B4 + A4 + D2    G700    7
2   C2 + D2 L2600 + L900    8
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

1 个答案:

答案 0 :(得分:1)

使用:

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

<强>解释

  1. 用于拆分
  2. 的拆分列的第一个set_index
  3. 使用Series
  4. MultiIndex重塑stack
  5. split每行创建DataFrame regex - nees escape +,并为一个或多个空格使用\s+
  6. stackunstack重新定位第二级到列
  7. NaN
  8. 转发填充ffill
  9. reset_index
  10. 清理数据
  11. 如果列的顺序很重要,请添加reindex