将操作应用于字典中的所有数据框而无循环

时间:2018-10-31 10:41:10

标签: python pandas dictionary for-loop dataframe

我已经完成了

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年的列都有:“州”,“区”和“日期” 我想在“ d”的所有数据框中创建一个名称为“ cat”的列,该列将具有state和“ districts”的“ coloumns”的串联值 我有另一个数据框说df,也有一个列“猫”。 我想将此合并到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 :(得分:1)

有了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)

答案 1 :(得分:0)

您可以将生成器传递到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']