Применить операции ко всем фреймам данных в словаре без цикла - PullRequest
0 голосов
/ 31 октября 2018

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

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 голосов
/ 31 октября 2018

Вы можете передать генератор в 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']
0 голосов
/ 31 октября 2018

С 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...