#python #pandas
#python #pandas
Вопрос:
необходимо импортировать около 30 CSV-файлов в python, для этого у меня есть цикл for, но мне нужно преобразовать в понимание списка
Структура всех файлов одинакова, и у них одинаковые имена столбцов, из всего этого мне нужно всего несколько столбцов, как указано в коде, и нужно создать один столбец, который может различать данные
цикл for
import pandas as pd
cwd = os.getcwd()
dirs =os.listdir(cwd)
dfx=[]
for items in dirs:
if items.find('GSVA')>0 and items.find('.csv')>0:
x=cwd '\' items
temp_df=pd.read_csv((x),encoding = "ISO-8859-1")
temp_df=temp_df.loc[::,['S.No.','Item','2014-15']]
temp_df['State']=items.split('-')[1]
dfx.append(temp_df)
gsva = pd.concat(dfx)
Я пробовал нижеприведенное, но не работает
import os
cwd = os.getcwd()
directory = os.listdir(cwd)
gsva = [(gsva.append(temp)
temp['State']=items.split('-')[1]
temp = temp.loc[::,['S.No.','Item','2014-15']]
temp = pd.read_csv(cwd '\' items)
for items in directory
if items.find('GSVA')>0 ]
gsva_1 = pd.concat(gsva)
Комментарии:
1. Зачем вам нужно преобразовать цикл в понимание? Это не сделает код быстрее или более читабельным.
2. это своего рода задача, которую нам дают, и как часть задачи нам нужно использовать только понимание списка, а не циклы for
3. @meowgoesthedog прав. Результат будет уродливым и нечитаемым. Здесь наша цель — превратить плохой код в хороший, а не наоборот.
4. @boargules Я не думаю, что результат будет уродливым и нечитаемым.
5. @naivepredictor Я должен признать, что вы проделали отличную работу. Я все еще думаю, что оригинал легче читать и его легче поддерживать, и что инструкторам не следует поощрять новичков писать понимания списков, которые реализуют процедурные однострочники.
Ответ №1:
import os
import pandas as pd
cwd = os.getcwd()
dirs = filter(lambda x: x[1]>=0 and x[2]>0, [(x, x.find('.csv'), x.find('GSVA')) for x in os.listdir(cwd)])
temp_df = [pd.read_csv((x),encoding = "ISO-8859-1") for x in [cwd '\' x for x in dirs]]
def add_state(x):
x['State'] = x.split('-')[1]
return x
gsva = pd.concat(list(map(add_state, [temp_df.loc[::,['S.No.','Item','2014-15']] for x in temp_df])))
Комментарии:
1. Привет, наивный предиктор, большое спасибо за ответ, но я все еще получаю следующую ошибку: ( 6 каталогов = filter(lambda x: x[1]>= 0 и x[2]> 0, [(x, x.find(‘.csv’), x.find(‘GSVA’)) для x в os.listdir(cwd)]) —-> 7 temp_df = [pd.read_csv((x ),encoding = «ISO-8859-1») для x в [cwd ‘\’ x для x в каталогах]] 8 9 def add_state(x): TypeError: может только объединить str (не «кортеж») в str