Python:如何将一个包含Dataframe的字典转换为一个具有以前一个字典的键作为列名的大型Dataframe?
Python:如何将一个包含Dataframe的字典转换为一个具有以前一个字典的键作为列名的大型Dataframe?
所以我的数据框是由许多个体的Excel文件组成的,每个文件的文件名都是日期,电子表格中记录了当天水果的价格,所以电子表格的样子是这样的:
15012016: Fruit Price Orange 1 Apple 2 Pear 3 16012016: Fruit Price Orange 4 Apple 5 Pear 6 17012016: Fruit Price Orange 7 Apple 8 Pear 9
为了将所有这些信息放在一起,我运行以下代码将所有信息放入数据框字典中
(所有水果价格文件存储在'C:\Fruit_Prices_by_Day'中)
#找到所有文件名 file_list = [] for x in os.listdir('C:\Fruit_Prices_by_Day'): file_list.append(x) file_list= list(set(file_list)) d = {} for date in Raw_list: df1 = pd.read_excel(os.path.join('C:\Fruit_Prices_by_Day', date +'.xlsx'), index_col = 'Fruit') d[date] = df1
然后这是我卡住的地方。如何将这个字典转换为数据框,其中列名是字典的键,即日期,这样我就可以在同一个数据框中获得每天每种水果的价格,如下所示:
15012016 16012016 17012016 Orange 1 4 7 Apple 2 5 8 Pear 3 6 9
问题的原因是想将一个包含多个Dataframes的字典合并成一个大的Dataframe,其中每个Dataframe的列名作为前一个字典的键名。
解决方法是使用Python的pandas库中的concat函数和assign方法。首先,需要遍历字典中的每个键值对,将每个Dataframe的列名作为常量列添加到Dataframe中,然后使用concat函数将所有Dataframe连接起来。最后,使用set_index方法将日期列设置为索引。
以下是具体的代码实现:
import pandas as pd # 创建一个包含多个Dataframes的字典 d = { 'df1': pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}), 'df2': pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]}) } # 使用concat函数和assign方法将字典中的Dataframes合并成一个大的Dataframe result = pd.concat( (i_value_df.assign(date=i_key) for i_key, i_value_df in d.items()) ).set_index('date') print(result)
运行以上代码,将得到一个新的Dataframe,其中每个Dataframe的列名作为前一个字典的键名。
问题的原因是将一个由多个DataFrame组成的字典转换为一个大的DataFrame,其中列名是前一个字典的键。解决方法是使用DataFrame的set_index方法将每个DataFrame的索引设置为'Fruit'列,然后使用concat方法将这些DataFrame连接在一起,最后使用droplevel方法移除多级索引中的最后一级。
具体代码如下:
d = { k: v.set_index('Fruit') for k, v in d.items()} df = pd.concat(d, axis=1) df.columns = df.columns.droplevel(-1) print df
如果在concat方法中遇到问题,可以检查是否存在重复的索引值。
参考链接:[stackoverflow.com/questions/27719407](https://stackoverflow.com/questions/27719407)
问题出现的原因是,需要将一个字典中的多个DataFrame合并成一个大的DataFrame,并且要求合并后的DataFrame的列名应该是原始字典的key。
解决方法是使用pandas库的concat()函数将字典中的多个DataFrame按列合并起来。然后使用sum()函数对合并后的DataFrame进行求和操作,通过level参数指定按照哪个层级进行求和。
具体的解决方案如下所示:
pd.concat(d, axis=1).sum(axis=1, level=0)
首先使用concat()函数将字典中的多个DataFrame按列合并起来,得到一个合并后的DataFrame。合并后的DataFrame如下所示:
15012016 16012016 17012016 Price Price Price Fruit Orange 1 4 7 Apple 2 5 8 Pear 3 6 9
然后使用sum()函数对合并后的DataFrame进行求和操作,通过level=0参数指定按照第一层级进行求和。求和后的DataFrame如下所示:
15012016 16012016 17012016 Fruit Orange 1 4 7 Apple 2 5 8 Pear 3 6 9
然而,上述代码的使用会出现一个警告信息:“FutureWarning: Using the level keyword in DataFrame and Series aggregations is deprecated and will be removed in a future version. Use groupby instead. df.sum(level=1) should use df.groupby(level=1).sum().”
该警告信息是因为在未来的版本中,对DataFrame和Series进行聚合操作时不再支持使用level参数,而是要使用groupby()函数。警告信息建议改为使用df.groupby(level=1).sum()来替代df.sum(level=1)。
通过使用pd.concat()函数和sum()函数,我们可以将一个字典中的多个DataFrame合并成一个大的DataFrame,并且保持合并后的DataFrame的列名与原始字典的key一致。需要注意的是,在未来的版本中,要使用groupby()函数替代sum()函数的level参数来进行聚合操作。