У меня есть большой CSV-файл, который я хочу редактировать. Редактирование здесь означает удаление столбцов, которые имеют только одно значение. Пока что я написал это (так как я новичок в Python, я застрял и не уверен, что это правильное решение проблемы):

import csv
import collections
import numpy as np 


number_of_rows = 2432 
interseting_cols = [] 

col_values = collections.defaultdict(list)
col_values_named = collections.defaultdict(list)
new_row = collections.defaultdict(list)
inputFile = open('input.csv', 'r',newline='');
outputFile= open('output.csv','w')

reader = csv.reader(inputFile)
writer = csv.writer(outputFile)
#skip field names
next(reader)
for row in reader:
    for col, value in enumerate(row):
        col_values[col].append(value)
        #each column is now saved col_values ( without the headers )


for  i in range(len(col_values)):
    if len(set(col_values[i][:(number_of_rows-1)])) != 1:
        interseting_cols.append(i)# saved the index of the columns with valid values 

inputFile.seek(0)

# reading the file again now with headers
for row in reader:
    for col, value in enumerate(row):
        col_values_named[col].append(value)# saving the columns now with header 


# generating a new CSV file, only with interessting columns :
for i in range(number_of_rows):
    print("i value ",i)
    for j in range(len(interseting_cols)): # I'm not sure about this PART !!!!
            new_row.append(col_values_named[interseting_cols[j]])
            writer.writerow(new_row)

Есть идеи, как сделать последний цикл? Или есть лучший способ решить это?

< Сильный > UPDATE скажем файл выглядит

---------------------------------------------------
            |A|B   |C   |D  |F   |G|H   |I|J  |K   |       
--------------------------------------------------- 
1           |1|NULL|444 |201|0.01|A|NULL|4|9.5|NULL|     
--------------------------------------------------- 
2           |2|NULL|NULL|201|0   |A|NULL|4|9.5|NULL|
--------------------------------------------------- 
3           |4|NULL|444 |201|0   |A|NULL|4|9.5|NULL|
--------------------------------------------------- 
4           |1|NULL|444 |201|0   |A|NULL|4|9.5|NULL|

В этом случае результат должен включать только три столбца A, C и F

2
Engine 22 Мар 2017 в 15:48

2 ответа

Лучший ответ

Используя библиотеку pandas, вы можете сократить всю свою дополнительную работу за счет собственных встроенных функций. Вот небольшая реализация требования, которое вы опубликовали выше. Если вы новичок и нуждаетесь в немного более четких объяснениях, напишите мне в комментарии, и я готов дать немного больше информации. Кстати, начните играть с пандами.

import pandas as pd 

df = pd.read_csv('input.csv')

for columns in df:
    if len(df[columns].unique()) == 1:
        df.drop(columns, 1, inplace=True)

df.to_csv('output.csv', index=None)
1
Naveen Honest Raj K 22 Мар 2017 в 13:04

Если таблица действительно не огромна, просто прочитайте всю статью и найдите то, что вы хотите!

Непроверенный код:

headers = reader.next()
sheet = []
for row in reader:
    sheet.append(row)

# assuming all rows are the same length ...
for colno,header in enumerate(headers):
    col = [ row[colno] for row in sheet ]
    distinct = set( col)
    if len(distinct) > 1:
        # col contains at least two distinct values, so
        # do something with it and its header and/or column number
        writer.writerow(  [header, colno] + col )
0
nigel222 22 Мар 2017 в 13:47