Python:如何将Dataframes的字典转换成一个大的数据帧,列名是前一个字典的关键字?

pak*_*rob 10 python dictionary dataframe python-2.7 pandas

所以我的数据框是由许多单独的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
Run Code Online (Sandbox Code Playgroud)

因此,为了将所有信息放在一起,我运行以下代码将所有信息放入数据帧的字典中(所有水果价格文件存储在'C:\ Fruit_Prices_by_Day'中)

#find all the file names
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
Run Code Online (Sandbox Code Playgroud)

然后这就是我被卡住的部分.然后我如何将这个dict变成一个数据框,其中列名是dict键,即日期,所以我可以在同一个数据帧中得到每个每个水果的价格,如:

          15012016   16012016   17012016   
Orange    1          4          7
Apple     2          5          8
Pear      3          6          9
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 12

您可以先尝试使用set_index所有数据帧comprehension,然后使用concat删除multiindex列中的最后一级od :

 print d
{'17012016':     Fruit  Price
0  Orange      7
1   Apple      8
2    Pear      9, '16012016':     Fruit  Price
0  Orange      4
1   Apple      5
2    Pear      6, '15012016':     Fruit  Price
0  Orange      1
1   Apple      2
2    Pear      3}
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
        15012016  16012016  17012016
Fruit                               
Orange         1         4         7
Apple          2         5         8
Pear           3         6         9
Run Code Online (Sandbox Code Playgroud)


Саш*_*кин 8

解决方案:

pd.concat(d, axis=1).sum(axis=1, level=0)
Run Code Online (Sandbox Code Playgroud)

解释:

之后.concat(d, axis=1)你会得到

        15012016  16012016  17012016
        Price     Price     Price
Fruit                               
Orange       1         4         7
Apple        2         5         8
Pear         3         6         9
Run Code Online (Sandbox Code Playgroud)

添加.sum(axis=1, level=0)将其转换为

        15012016  16012016  17012016
Fruit                               
Orange       1         4         7
Apple        2         5         8
Pear         3         6         9
Run Code Online (Sandbox Code Playgroud)


Igo*_*bia 6

像这样的事情可以工作:循环字典,添加带有字典键的常量列,连接然后将日期设置为索引

pd.concat(
    (i_value_df.assign(date=i_key) for i_key, i_value_df in d.items())
).set_index('date')
Run Code Online (Sandbox Code Playgroud)