Слияние значений в dataframe для записи в Excel - PullRequest
0 голосов
/ 04 июля 2018

У меня есть датафрейм, похожий на

       column1    column2     column3    colum4  column5 
1      r_n_1      r_s_1       r_n_2      r_s_3   r_n_3
2      r_n_1      r_s_1       r_n_4      r_s_4   r_n_5
3      r_n_1      r_s_1       r_n_6      r_s_5   r_n_7
4      r_n_1      r_s_1       r_n_6      r_s_6   r_n_9
5      r_n_10     r_s_7       r_n_11     r_s_8   r_n_12
6      r_n_10     r_s_9       r_n_11     r_s_10  r_n_13

И я хотел бы объединить ячейки в фрейме данных, чтобы я мог написать в Excel, что может выглядеть как enter image description here

Таким образом, в основном объединяются ячейки, которые имеют одинаковое значение в Excel. Я думаю, я могу использовать MultiIndex от панд, но я не знаю, как это сделать.

мой код для получения этого фрейма данных похож на

 new_list = []
    for k1 in remove_empties_from_dict(combined_dict):
     curr_dict = remove_empties_from_dict(combined_dict)[k1]
         for k2 in curr_dict:
              curr_dict_2=curr_dict[k2]
                for k3 in curr_dict_2:
                    curr_dict_3=curr_dict_2[k3]
                       for k4 in curr_dict_3:
                            curr_dict_4=curr_dict_3[k4]
                                new_dict= {'c1': k1, 'c2': k2, 'c3': k3, 'c4': k4,'c5': curr_dict_4}
new_list.append(new_dict)
df = pd.DataFrame(new_list)

1 Ответ

0 голосов
/ 05 июля 2018

Я не смог найти прямую функцию, которая выполняет объединение ячеек с одинаковыми значениями, поэтому вместо этого я написал код, который делает это.

print(df)

  column1 column2 column3 column4 column5
0   r_n_1   r_s_1   r_n_2   r_s_3   r_n_3
1   r_n_1   r_s_1   r_n_4   r_s_4   r_n_5
2   r_n_1   r_s_1   r_n_6   r_s_5   r_n_7
3   r_n_1   r_s_1   r_n_6   r_s_6   r_n_9
4  r_n_10   r_s_7  r_n_11   r_s_8  r_n_12
5  r_n_10   r_s_9  r_n_11  r_s_10  r_n_13

Это df, с которым я должен работать. Но чтобы сделать то, что я сделал, я повторил один раз, чтобы проверить, какие значения похожи, и заменил на -. Причина, по которой я не сделал это NoneType, заключалась в том, что ячейки под таблицей имеют значение NoneType, поэтому дальнейшая часть кода будет повторяться бесконечно. То, что я сделал, было:

for i in df.columns:
    for j in range(len(df[i])):

        for k in range(j+1,len(df[i])):
            if df[i][j]== df[i][k]:                
                df[i][k]='-' 

Так что теперь мой df выглядит примерно так:

print(df)

  column1 column2 column3 column4 column5
0   r_n_1   r_s_1   r_n_2   r_s_3   r_n_3
1       -       -   r_n_4   r_s_4   r_n_5
2       -       -   r_n_6   r_s_5   r_n_7
3       -       -       -   r_s_6   r_n_9
4  r_n_10   r_s_7  r_n_11   r_s_8  r_n_12
5       -   r_s_9       -  r_s_10  r_n_13

Теперь, когда у меня есть все уникальные значения во фрейме данных, я проверю, является ли элемент df допустимым входным значением или -. И ячейки - будут объединены с его верхним значением. Я сделал это:

from openpyxl.workbook import Workbook    
exportPath = r'C:\Users\T01144\Desktop\PythonExport.xlsx'

wb= Workbook()
ws=wb.active
rowInd=1
colInd=1
colList=['-', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I'] # Continue if there are more columns  

for i in df.columns:
    for j in range(0,len(df[i])):
        if(df[i][j]!='-'):
            ws.cell(row=rowInd,column=colInd,value=df[i][j])            
        else:
            count=0
            for l in range(j+1,len(df[i])):
                count+=1
                if df[i][l]!='-':
                    count-=1
                    break
            ws.merge_cells(str(str(colList[colInd]+str(rowInd-1))+":"+str(colList[colInd]+str(rowInd+count))))
        rowInd+=1

    colInd+=1
    rowInd=1  

Вывод, который у меня сейчас есть:

Excel Output

Весь код можно найти здесь .

ПРИМЕЧАНИЕ. Некоторые из вас могут получить эту ошибку после создания Excel:

Мы обнаружили проблему с некоторым содержимым в PythonExport.xlsx. Вы хотите, чтобы мы попытались восстановить столько, сколько мы можем? Если вы доверяете источнику этой книги, нажмите Да.

Просто игнорируйте эту ошибку и нажмите Да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...