将操作应用于字典中的所有数据帧,无需循环

Posted

技术标签:

【中文标题】将操作应用于字典中的所有数据帧,无需循环【英文标题】:Apply operations to all dataframes in a dictionary without loop 【发布时间】:2019-04-04 12:09:12 【问题描述】:

我已经关注了

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 都有列:'state' 'districts' 和 'dates'

我想在“d”中的所有数据框中创建一个列cat,该列将具有statedistricts 列的串联值。

我有另一个数据框 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###)

做剩余的计算

【问题讨论】:

【参考方案1】:

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

【讨论】:

不,我不能只是将它们连接起来,因为每年的行顺序可能不同 @makarandkulkarni 您可以传递usecols 参数来指定列顺序,如下所述:pandas.pydata.org/pandas-docs/stable/generated/…,这样可以解决问题吗?【参考方案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)

【讨论】:

感谢您的回复“使用数据帧的字典,您无法避免循环”我不能只是将它们连接起来,因为每年的行序列可能不同 @makarandkulkarni,当然,所以你不能做你想做的事。我希望我已经解释了为什么会出现这种情况。 不可能也节省我上网所需的时间,相反我会要求我的电脑工作更多时间

以上是关于将操作应用于字典中的所有数据帧,无需循环的主要内容,如果未能解决你的问题,请参考以下文章

将用户定义的函数应用于 PySpark 数据帧并返回字典

如何使用循环将多个条件应用于数据帧

将数据帧字典合并为 1 个单个数据帧

Pandas:将 Lambda 应用于多个数据帧

按名称从字典中提取数据框

如何将具有不同参数的多个sklearn算法应用于多个数据帧?