使用Python将不同长度的Excel列分成多行

问题描述 投票:0回答:1

我正在尝试使用 python 循环遍历 Excel 电子表格中的行,如果相关列有多个换行符或回车符,则将一行中的数据分成多行。

在下面的示例数据集中,我将使用第 3 列来确定是否需要扩展行。显示的“当前数据集”是 Excel 中的一行,其中第 3 - 8 列在单元格内有多行。这只是我的电子表格上需要扩展的一行多行,有些可能没有需要拆分的多个换行符或回车符。第 1 列和第 2 列始终为一行,需要添加到新行中。数据中可能存在空白点,这些空白点只是需要在目标数据集中考虑的空换行符回车符。第 3 - 8 列将具有相同数量的行,这些行将代表新行。

我尝试使用 pandas 爆炸功能,但我留下了一些行的荒谬数量的副本。一次尝试,将大约 50 行变成 1,500 行。

Current data set                            
Col 1   Col 2   Col 3   Col 4   Col 5   Col 6   Col 7   Col 8
Num 1   Num 2   "Num 3  "Text 1 "Num 7  "Text 5 "Num 11 "Text 9
                 Num 4   Text 2  Num 8   Text 6          Text 10
                 Num 5   Text 3  Num 9   Text 7  Num 12
                 Num 6"  Text 4" Num 10" Text 8" Num 13" Text 11"
        
                                            
                            
Goal data set                           
Col 1   Col 2   Col 3   Col 4   Col 5   Col 6   Col 7   Col 8
Num 1   Num 2   Num 3   Text 1  Num 7   Text 5  Num 11  Text 9
Num 1   Num 2   Num 4   Text 2  Num 8   Text 6          Text 10
Num 1   Num 2   Num 5   Text 3  Num 9   Text 7  Num 12  
Num 1   Num 2   Num 6   Text 4  Num 10  Text 8  Num 13  Text 11
data = pd.read_excel(f'Output\\spreadSheet.xlsx')
columns = data.columns.tolist()
for column in columns:
    if column == "Col 3":
        continue

    for idx, status in enumerate(data[column]):
        try:
            if '\n' in status:
                    data[column] = data[column].str.split('\n \n')
                    data = data.explode(column)
        except:
            continue

data.to_excel(f'Output\\spreadSheet.xlsx')
python pandas pandas-explode
1个回答
0
投票

我创建了简单的示例来重现:

df = pd.DataFrame( [[1, 2, 'A\n2\n1\n3\n7', 
                     'A\n9\n9\n9\n9', 
                     'A\n2\nV\n4\n1', 
                     'A\n2\n1\n\n7', 
                     'A\n3\n1\n3\n3', 
                     'A\n\n\nB\nB']], columns =[f'Col {i}' for i in range(1,9)])
df


Col 1   Col 2   Col 3   Col 4   Col 5   Col 6   Col 7   Col 8
0   1   2   A\n2\n1\n3\n7   A\n9\n9\n9\n9   A\n2\nV\n4\n1   A\n2\n1\n\n7    A\n3\n1\n3\n3   A\n\n\nB\nB

我认为创建第二个数据框比修改现有的数据框更容易。即,

df_rep = pd.DataFrame(index = range(len(df['Col 3'][0].split('\n'))), #number of indexes defined by col3
columns =[f'Col {i}' for i in range(1,9)])
df_rep

df_rep['第 1 列'] = df.iat[0,0] df_rep['第 2 列'] = df.iat[0,1] 对于范围 (3,9) 内的 i: df_rep['Col {}'.format(i)] = df['Col {}'.format(i)][0].split(' ') df_rep

© www.soinside.com 2019 - 2024. All rights reserved.