Применять операции ко всем фреймам данных в словаре без цикла

Я сделал следующее

myrng=range(1971,2009)
d = {}
for name in myrng:
    wd1=pd.read_csv('D:\\temp\\'+str(name)+'.csv')
    d[str(name)] = wd1
    del wd1
d.keys() 

дает

dict_keys(['1971',.... '2009'])  

В каждом из 1971 ... 2009 годов есть столбцы: «штат», «районы» и «даты».

Я хочу создать столбец cat во всех фреймах данных в «d», который будет иметь объединенные значения столбцов state и districts.

У меня есть другой фрейм данных, скажем, df, в котором также есть один столбец cat.

Я хочу объединить это со всеми фреймами данных в d. Дело в том, что я хочу избежать петель. Я могу сделать это с помощью цикла for, так как хочу делать это несколько раз.

Код for может выглядеть следующим образом

for name in myrng:
    A=d[str(name)]
    A['cat']=A.state + A.district
    A= pd.merge(df,A ....### option###)

сделать оставшиеся расчеты

2
0
731
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С dict фреймов данных вы не можете избежать цикла

Если вы хотите, чтобы ваши данные были структурированы как словарь фреймов данных, вы не можете избежать цикла for. Это связано с тем, что каждое значение фрейма данных в вашем словаре является отдельным экземпляром pd.DataFrame. Вы не можете временно связать их для одной или нескольких операций.

Упрощение логики

Вы можете использовать понимание списка с pipe просто для своей логики / цикла:

def transformer(df):
    df['cat'] = df['state'] + df['district']
    df = pd.merge(df, ...)
    return df

d = {name: pd.read_csv(fr'D:\temp\{name}.csv').pipe(transformer) for name in myrng}

Объединение фреймов данных в вашем dict

Если вы хотите избежать циклов, вы можете использовать pd.concat для объединения фреймов данных в вашем словаре и применения ваших преобразований:

df_combined = pd.concat(d.values()).pipe(transformer)

Спасибо за ответ «С dict фреймов данных, вы не можете избежать цикла». Я не могу просто объединить их, так как последовательность строк в каждом году может быть разной.

makarand kulkarni 31.10.2018 12:15

@makarandkulkarni, Конечно, так что ты не можешь делать то, что хочешь. Надеюсь, я объяснил Почему, что это так.

jpp 31.10.2018 12:16

Невозможно также сэкономить мое время, необходимое для серфинга в сети, вместо этого я попрошу свой компьютер поработать больше времени

makarand kulkarni 31.10.2018 13:58

Вы можете передать в pd.concat генератор, чтобы объединить все данные файла вместе. Затем по результату можно рассчитать столбец 'cat'.

myrng=range(1971,2009)
data = pd.concat(
    pd.read_csv('D:\\temp\\'+str(name)+'.csv', usecols=['dates', 'state', 'district'])
    for name in myrng
)
data['cat'] = data['state'] + data['district']

нет, я не могу просто объединить их, поскольку последовательность строк в каждом году может быть разной

makarand kulkarni 31.10.2018 12:19

@makarandkulkarni. Вы можете передать аргумент usecols, чтобы указать порядок столбцов, как описано здесь: pandas.pydata.org/pandas-docs/stable/generated/…, это решит проблему?

daz 31.10.2018 12:25

Другие вопросы по теме