2017-01-24 3 views
0

Ich versuche, eine Spalte zu organisieren, indem Sie die Werte filtern. Mit anderen Worten, es gibt Tausende sich wiederholender Namen und ich möchte nur einen Namen aus jeder "Gruppe" nehmen und ihn in eine andere Spalte kopieren.Filter eine Spalte in Excel Python

So ist die Spalte A ist die aktuelle Situation und die Spalte das Ergebnis ich bekommen wird sein:

Column A     Column B 

AB Mark Sociedad Ltda  AB Mark Sociedad Ltda 
AB Mark Sociedad Ltda  Acosta Acosta Manuel 
AB Mark Sociedad Ltda  ALBAGLI, ZALIASNIK 
AB Mark Sociedad Ltda 
Acosta Acosta Manuel 
Acosta Acosta Manuel 
Acosta Acosta Manuel 
ALBAGLI, ZALIASNIK 
ALBAGLI, ZALIASNIK 
ALBAGLI, ZALIASNIK 

Schließlich dies das Skript Ich versuche zu verwenden:

import openpyxl 
from openpyxl import load_workbook 
import os 

os.chdir('path') 
workbook = openpyxl.load_workbook('abc.xlsx') 
page_i = workbook.get_sheet_names() 
sheet = workbook.get_sheet_by_name('Sheet1') 

for a in range(1, 10): 
    representativex = sheet['A' + str(a)].value 
    tuple(sheet['A1':'A10']) 

    for row in sheet['A1':'A10']: 
     if representativex in row: 
      continue 
     else: 
      sheet['B' + str(a)].value 
      sheet['B' + str(a)] = representativex 

     workbook.save('abc.xlsx') 

Leider es funktioniert nicht.

+0

Sie versuchen, die Spalte zu einfach dedupe? –

+0

Hallo Dmitry. Genau das versuche ich in Python zu deduplizieren. –

+0

Excel hat diese Funktionalität bereits. Siehe [hier] (https://support.office.com/de-de/article/Filter-for-unique-values-or-remove-duplicate-values-ccf664b0-81d6-449b-bbe1-8daaec1e83c2) –

Antwort

1

Ich benutze Python nicht wirklich dafür aber hier ist eine grobe Art, die ich relativ schnell gefunden habe.

import openpyxl 

wb = openpyxl.load_workbook('test.xlsx') 
ws1 = wb.active 

Sample Data

names = [] 
for row in ws1.columns[0]: 
    names.append(row.value) 

names = sorted(list(set(names))) 

start = 1 
for name in names: 
    ws1.cell(row = start, column=2).value = name 
    start += 1 

wb.save('test.xlsx') 

Sample Output Data

bearbeiten: Anscheinend ist der neuere Upgrade von openpyxl braucht eine leichte Modifikation

ändern diese:

for row in ws1.columns[0]: 
     names.append(row.value) 

Um dies:

for row in ws1.iter_cols(max_col = 1, min_row=1): 
    for cell in row: 
     names.append(cell.value) 

Und falls Ihre Spalten unterschiedlich sind,

iter_cols(min_col=None, max_col=None, min_row=None, max_row=None)[source] 

Returns all cells in the worksheet from the first row as columns. 

If no boundaries are passed in the cells will start at A1. 

If no cells are in the worksheet an empty tuple will be returned. 
Parameters: 

    min_col (int) – smallest column index (1-based index) 
    min_row (int) – smallest row index (1-based index) 
    max_col (int) – largest column index (1-based index) 
    max_row (int) – smallest row index (1-based index) 
+0

Danke für Ihre Hilfe Dmitry. Ich versuche, Ihr Skript genau so zu benutzen, wie Sie getippt haben, aber es hat diesen Fehler ***** für Zeile in ws1.columns [1] aufgetaucht: TypeError: 'Generator' Objekt ist nicht einklagbar [Beendet in 5.3s mit Exitcode 1] ***** Weißt du warum? –

+0

Überprüfen Sie die Bearbeitung meiner Post –

+0

Vielen Dank Dmitry! Es hat perfekt funktioniert! –