2017-10-23 2 views
0

Ich versuche, diese 2017.01.03 3.6.1, PyCharm mit Python zu erreichen, Openpyxl 2.4.7 und Excel 2016.Mit DefaultDict (List) mit Openpyxl

Hier sind meine Daten-Set:

Sheet1:

productnum|keyword1|keyword2 
0001  |red  |big  
0001  |blue |red 
0001  |large |blue 
0002  |green | 
0002  |small |blue 

ich mag würde damit Ende:

productnum|keyword1  |keyword2 |combinedkeywords 
0001  |red;blue;large|big;red;blue|red;blue;large;big 
0002  |green;small |blue  |green;small;blue 

ich informiert worden, dass DefaultDict (List) ist eine gute wa y, um diese Aufgabe zu erfüllen. Hier ist, was ich versucht habe, so weit dies zu tun:

for rownum in range(1,maxRow): 
    partnum = str(sheet1.cell(row=rownum, column=1).value) 
    keyword1 = str(sheet1.cell(row=rownum, column=3).value) 


    s = [(partnum,keyword1)] 
      print(s) 
      d = defaultdict(list) 
      for k, v in s: 
      d[k].append(v) 

Aber was ich am Ende ist nicht genau das, was ich brauche, herauskommen als so etwas wie:

[('0001', 'red'] 
[('0001', 'blue'] 

Und so weiter.

Hat jemand einen Rat, wie ich dies mit defaultdict (Liste) erreichen kann? Danke im Voraus!

Antwort

0

Dies ist hier keine direkte Antwort auf Ihre Frage zu defaultdict, sondern eher eine alternative Lösungsmethode. Sie könnten pandas verwenden, um Ihre Daten zu verarbeiten. Der folgende Code:

import pandas as pd 

# Read excel table into pandas dataframe 
df = pd.read_excel('workbook.xlsx') 

# Aggregate unique keywords for each product number 
func = lambda x: tuple(x.unique()) 
df2 = df.groupby('productnum').agg(func) 

# Create column for all keyword combinations 
func = lambda x: tuple(set(x.keyword1) | set(x.keyword2)) 
df2['combinedkeywords'] = df2.apply(func, axis=1) 

# Print result dataframe to screen and also to excel file 
print(df2) 
df2.to_excel('workbook2.xlsx') 

erzeugt diese als Ausgabe:

     keyword1   keyword2   combinedkeywords 
productnum 
1   (red, blue, large) (big, red, blue) (red, large, blue, big) 
2    (green, small)  (nan, blue) (nan, green, blue, small)