熊猫:从不一致的行中整理数据

时间:2019-05-27 15:09:32

标签: python pandas

我有一个这样的输入Excel电子表格:

key  | value | other data
------------------------- ...
k1   | v1    | d1
     | v2    |
     | v3    |
k2   | v2    | d2
     | v5    |
k3   | v1    | d3

值存储在一个空的空间中,除了value列,该行位于匹配键所在行的正下方,并且可以将任意数量的值绑定到该键,但是不太可能超过三个。所有键都是唯一的,“其他数据”可能会丢失或重复,大约有十二个值和数千个数据行。

我需要将输入表转换为以下格式:

k1   | v1,v2,v3 | d1 | ...
k2   | v2,v5    | d2 | ...
k3   | v1       | d3 | ...

我已经用openpyxl和简单的迭代算法解决了这个问题,我想知道是否有更优雅的方法可以使用Pandas的DataFrame操作工具来做到这一点?我搜索了Pandas数据操作教程,但是我发现大部分可以使用groupby()agg()来解决,因为我没有专栏文章,因此我无法汇总,并且只能依赖于键一贯独特。

正面解决方案,我现在使用过:

import openpyxl
wb = openpyxl.load_workbook('in.xlsx')
ws = wb['Sheet1']

row_data = None
out_list = list()
i = 2
while i < ws.max_row + 1:
    if ws[i][0].value is not None:
        if row_data is not None:
            out_list += [row_data]
        row_data = list(ws[i])
    else:
        row_data[1].value = f'{row_data[1].value}' + f',{ws[i][1].value}'
    i += 1

out_list += [list(ws[ws.max_row])]   # append the last row to the output

wb_out = openpyxl.Workbook()
ws_out = wb_out.active

for row in out_list:
    ws_out.append([cell.value for cell in row])

wb_out.save('out.xlsx')

1 个答案:

答案 0 :(得分:2)

考虑到excel的熊猫方法如下:

enter image description here

df= pd.read_excel(r'C:\path\excelfile.xlsx',sheet_name='Sheet_Name')
df=(df.groupby(df.key.ffill()).agg({'value':lambda x: ','.join(x),'other data':'first'})
                                                                .reset_index())

  key     value other data
0  k1  v1,v2,v3         d1
1  k2     v2,v5         d2
2  k3        v1         d3