嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据
Posted
技术标签:
【中文标题】嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据【英文标题】:Pandas nested for loop insert multiple data on different data frames created 【发布时间】:2017-08-31 01:09:59 【问题描述】:我是数据科学的新手,我目前正在练习以提高我的技能。我使用了来自 kaggle 的数据集,并计划了如何呈现数据并遇到了一个问题。
我试图实现的是使用 for 循环将数据插入不同的数据帧。我见过这样的一个例子,使用字典保存数据帧,但是数据帧上的数据被覆盖了。
我有一个数据框列表:
continents_list = [african_countries, asian_countries, european_countries, north_american_countries,
south_american_countries, oceanian_countries]
这是我来自某个大陆的数据框示例:
Continent Country Name Country Code 2010 2011 2012 2013 2014
7 Oceania Australia AUS 11.4 11.4 11.7 12.2 13.1
63 Oceania Fiji FJI 20.1 20.1 20.2 19.6 18.6
149 Oceania New Zealand NZL 17.0 17.2 17.7 15.8 14.6
157 Oceania Papua New Guinea PNG 5.4 5.3 5.4 5.5 5.4
174 Oceania Solomon Islands SLB 9.1 8.9 9.3 9.4 9.5
我首先选择了一年中比率最高的国家/地区的整行:
def select_highest_rate(continent, year):
highest_rate_idx = continent[year].idxmax()
return continent.loc[highest_rate_idx]
然后创建了一个 for 循环,该循环为每个单独的年份创建不同的数据框,其中必须包含所有大陆及其对应的国家和该年份的汇率:
def show_highest_countries(continents_list):
df_highest_countries =
years_list = ['2010','2011','2012','2013','2014']
for continent in continents_list:
for year in years_list:
highest_country = select_highest_rate(continent, year)
highest_countries = highest_country[['Continent','Country Name',year]]
df_highest_countries[year] = pd.DataFrame(highest_countries)
return df_highest_countries
here is what it returns: different data frames but only for the last continent
问题:如何将所有数据(大陆)保存在同一个数据框中?用字典不行吗?
【问题讨论】:
【参考方案1】:目前,您正在用每个循环覆盖 year 索引,因此只剩下最后一个 2010-2014 年的大陆数据框:
df_highest_countries[year] = pd.DataFrame(highest_countries)
您可以添加 continent 以获得更独特的字典键,然后连接到一个最终数据帧:
df_highest_countries[continent+str(year)] = pd.DataFrame(highest_countries)
finaldf = pd.concat(df_highest_countries, join='outer').reset_index(drop=True)
或者,考虑避免嵌套的 for
循环,方法是在开始时将所有内容连接在一起,然后将 melt
的数据用于 groupby
聚合。然后,只保留每年和大陆具有此类最大值的国家/地区记录。如果需要,您可以使用 pivot_table
转回年份列。
df = pd.concat(continents_list)
# MELT FOR YEAR VALUES IN COLUMN
df = pd.melt(df, id_vars=['Continent', 'Country Name', 'Country Code'], var_name='Year')
# AGGREGATE HIGHEST VALUE AND MERGE BACK TO ORIGINAL SET
df = df.groupby(['Continent', 'Year'])['value'].max().reset_index().\
merge(df, on=['Continent', 'Year', 'value'])
# PIVOT BACK TO YEAR COLUMNS
pvt = df.pivot_table(index=['Continent', 'Country Name', 'Country Code'],
columns='Year', values='value').reset_index()
【讨论】:
非常感谢您回答我的问题。我从未遇到过melt
和pivot_table
。阅读文档后,我对它的工作原理感到惊讶。很高兴知道。非常感谢您分享这些信息!起初我也想过如何不使用嵌套的 for 循环,但就我目前所知道的情况而言,我真的很难考虑如何去做。非常感谢!
没问题。很高兴为一个有趣的问题提供帮助。确实,这些pandas方法往往会偏离一般的python有for
、if
、while
等方法。以上是关于嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据的主要内容,如果未能解决你的问题,请参考以下文章