将操作应用于字典中的所有数据帧,无需循环
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
,该列将具有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###)
做剩余的计算
【问题讨论】:
【参考方案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,当然,所以你不能做你想做的事。我希望我已经解释了为什么会出现这种情况。 不可能也节省我上网所需的时间,相反我会要求我的电脑工作更多时间以上是关于将操作应用于字典中的所有数据帧,无需循环的主要内容,如果未能解决你的问题,请参考以下文章