2016-07-03 4 views
0

ich ziemlich neu bin auf der Programmierung und will dieses Programm codieren, die die gemeinsame Spalten zwischen file1.csv und file2.csvWie die „Common“ Spalt zwischen zwei CSV-Dateien übertragen

Eingang übertragen:

file1.csv Aussehen dies wie:

ID,Nickname,Gender,SubjectPrefix,SubjectFirstName,Whatever1A,Whaterver2A,SubjectLastName 
1,J.,M,Dr.,Jason,,,Allan 
2,B.,M,Mr.,Brian,,,Welch 

file2.csv sieht wie folgt aus:

nickname,gender,city,id,prefix_name,first_name,Whatever1B,last_name,Whatever2B,Whatever3B,Whatever4B 

Problem:

Wie der Header file1.csv und file1.csv zu vergleichen, sie zu identifizieren und übertragen dann die "gemeinsame" Spalten dazwischen. Die „gemeinsame“ Spalten sind diejenigen, die ähnliche Namenskonvention haben (dh ID und id,Nickname und nickname), oder diejenigen, die die gleiche Namenskonvention nicht unbedingt haben, aber die gleichen Daten speichere, (dh SubjectPrefix und prefix_name,SubjectFirstName und first_name).

Ausgang:

Die Ausgabe wie folgt sein sollte.

  • Hinweis: die übertragenen Spalten "id", "nickname" und "gender" sind diejenigen mit ähnlichen Namensgebung zwischen file1.csv und file2.csv Header. Und die Spalten "prefix_name" und "first_name" sind die entsprechenden "SubjectPrefix" bzw. "SubjectFirstName".

    id,nickname,gender,prefix_name,first_name,last_name 
    1,J.,M,Dr.,Jason,Allan 
    2,B.,M,Mr.,Brian,Welch 
    

habe ich versucht, diesen Code:

import csv 
import collections 

csv_file1 = "file1.csv" 
csv_file2 = "file2.csv" 

data1 = list(csv.reader(file(csv_file1,'r'))) 
data2 = list(csv.reader(file(csv_file2,'r'))) 

file1_header = data1[0][:] #get the header from file1 
file2_header = data2[0][:] #get the header from file2 
lowered_file1_header = [item.lower() for item in file1_header] #lowercase file1 header 
lowered_file2_header = [item.lower() for item in file2_header] #lowercase file2 header anyways 
col_index_dict = {} 

for column in lowered_file1_header: 
    if column == "subjectprefix": # identify "subjectprefix" column in file1.csv 
     col_index_dict[column] = lowered_file1_header.index(column) 

    elif column == "subjectfirstname": # identify "subjectfirstname" column in file1.csv 
     col_index_dict[column] = lowered_file1_header.index(column) 

    elif column in file2_header: # identify the columns with same naming 
     col_index_dict[column] = lowered_file1_header.index(column) 

    else: 
     col_index_dict[column] = -1 # mark the not matching columns 

# Build header 
output = [col_index_dict.keys()] 
is_header = True 

for row in data1: 
    if is_header is False: 
     rowData = [] 
     for column in col_index_dict: 
      column_index = col_index_dict[column] 
      if column_index != -1: 
       rowData.append(row[column_index]) 
      else: 
       rowData.append('') 
     output.append(rowData) 
    else: 
     is_header = False 

print(output) 

Jede Idee, wie, wie dieses Problem zu lösen?

Antwort

-1

Dank Wboy für Ihren Beitrag, war Ihre Eingabe wirklich nützlich.

Ich konnte eine Lösung für das Problem mit Pandas-Bibliothek finden.Hier ist der Code:

import pandas as pd 

# read the csv files 
df = pd.read_csv('file1.csv') 
df2 = pd.read_csv('file2.csv') 

# lowercase the headers 
df.columns = df.columns.str.lower() 
df2.columns = df2.columns.str.lower() 

df_columns = set(list(df.columns)) 
df2_columns = set(list(df2.columns)) 

identifizieren und übertragen die "gemeinsamen" Spalten:

for col in list(df_columns): 
    for col2 in list(df2_columns): 
     if col == "subjectprefix" and col2 =="prefix_name": 
      # copy the data from df["subjectprefix"] column to df2["prefix_name"] column in df2 dataframe 
      df2["prefix_name"] = df['subjectprefix'] 
      df3 = [col2] 
     elif col == "subjectfirstname" and col2 =="first_name": 
      # copy the data from "subjectfirstname" column to "first_name" column 
      df2["first_name"] = df["subjectfirstname"] 
      df3.append(col2) 

     elif col =="subjectlastname" and col2 =="last_name": 
      #copy the data from "subjectfirstname" column to "last_name" column 
      df2["last_name"] = df["subjectlastname"] 
      df3.append(col2) 

     elif col == col2: 
      # copy the exactly matching to df2 
      df2[col2] = df[col] 
      df3.append(col2) 

Löschen Sie die "ungewöhnlich" Spalten aus dem Datenrahmen DF2:

for col2 in list(df2_columns): 
if not col2 in df3: 
    del df2[col2] 

# print the output 
df2.set_index("id",inplace=True) 
print df2 

Speichern Sie die Ausgabe als .csv-Datei:

Ich bin sicher, dies ist keine optimale Lösung und ich hoffe, dass der Code in Bezug auf die Identifizierung und Übertragung der "gemeinsamen" Spalten verbessert werden könnte. Mein Code ist voll mit if/elif-Anweisungen, und ich bin mir sicher, dass hier ein besserer Ansatz implementiert werden muss.

+0

Hier sehen Sie nach Ideen ... Set (Liste (x) wird nicht benötigt ... Erfahren Sie mehr über Pandas-Filterung mit "Isin". Https://people.duke.edu/~ccc14/sta-663/ EinführungToPythonSolutions.html – Merlin

1

Willkommen bei der Programmierung. Lassen Sie mich Ihnen die erstaunliche pandas library vorstellen.

Aus der Spitze meines Kopfes, hier ist etwas, das Ihr Problem lösen wird. (Ich sage nicht, seine effizient! Also für große Datensätze könnte es ein Problem sein)

import pandas as pd 

df = pd.read_csv('file1.csv') 
df2 = pd.read_Csv('file2.csv') 

df_columns = set(list(df.columns)) 
df2_columns = set(list(df2.columns)) 

common_columns = list(df_columns.intersection(df2_columns)) 

common_df = df[common_columns] 
common_df2 = df2[common_colmns] 

## At this point you have the common columns for both CSV's. if you want 
## to make them into one, just use df concatenate/append. else, you can save both of them like this: 

common_df.to_csv('common1.csv') 
common_df2.to_csv('common2.csv')