2017-06-13 565 views
1

我有一個數據框列表。每個數據幀最初都是從其中取得的數字數據,其形狀與21行和5列相同。第一列是索引(索引0到索引20)。我想要將平均值(平均值)計算爲單個數據幀。然後我想將數據框導出爲ex​​cel。在Python中用數據框計算平均值/平均值Pandas

這裏是我現有的代碼的簡化版本:

#look to concatenate the dataframes together all at once 
#dataFrameList is the given list of dataFrames 
concatenatedDataframes = pd.concat(dataFrameList, axis = 1) 

#grouping the dataframes by the index, which is the same across all of the dataframes 
groupedByIndex = concatenatedDataframes.groupby(level = 0) 

#take the mean 
meanDataFrame = groupedByIndex.mean() 

# Create a Pandas Excel writer using openpyxl as the engine. 
writer = pd.ExcelWriter(filepath, engine='openpyxl') 
meanDataFrame.to_excel(writer) 

然而,當我打開Excel文件,我看到什麼看起來像每一個數據幀複製到片,平均/不顯示平均值。一個簡單的例子如下所示(切割最行和dataframes的)

   Dataframe 1     Dataframe 2     Dataframe 3 
Index Col2 Col3 Col4 Col5  Col2 Col3 Col4 Col5  Col2 Col3 Col4 Col5 
0  Data Data Data Data  Data Data Data Data  Data Data Data Data 
1  Data Data Data Data  Data Data Data Data  Data Data Data Data 
2  Data Data Data Data  Data Data Data Data  Data Data Data Data 
.... 

我正在尋找更多的東西一樣:

  Averaged DF 
Index Col2         Col3         Col4 
0  Mean Index0,Col2 across DFs Mean Index0,Col3 across DFs Mean Index0,Col4 across DFs 
1  Mean Index1,Col2 across DFs Mean Index1,Col3 across DFs Mean Index1,Col4 across DFs 
2  Mean Index2,Col2 across DFs Mean Index2,Col3 across DFs Mean Index3,Col4 across DFs 
... 

我也已經看到了這樣的回答: Get the mean across multiple Pandas DataFrames

如果可能的話,我正在尋找一個乾淨的解決方案,而不是僅僅涉及通過值循環每個dataFrame值的方案。有什麼建議麼?

回答

1

也許我誤解了你所問的問題

解決方法很簡單。你只需要沿着正確的軸Concat的

僞數據

DF1 = pd.DataFrame(指數=範圍(行),列=範圍(列),數據= [[10 + I *對於jĴ (範圍(列))] i)範圍(行)]) df2 = df1 = pd.DataFrame(index = range(rows),columns = range(columns),data = [[i +列)]爲我在範圍(行)])

ps。這應該是你的工作,如OP

pd.concat

df_concat0 = pd.concat((df1, df2), axis=1) 

把所有的dataframes旁邊的海誓山盟。

0 1 0 1 
0 10 10 0 1 
1 10 11 1 2 
2 10 12 2 3 

如果我們現在想做一個GROUPBY,我們首先需要堆,GROUPBY和堆棧再次

df_concat0.stack().groupby(level=[0,1]).mean().unstack()

0 1 
0 5.0  5.5 
1 5.5  6.5 
2 6.0  7.5 

如果我們這樣做

df_concat = pd.concat((df1, df2)) 

Thi s讓所有dataframes上的海誓山盟

0 1 
0 10 10 
1 10 11 
2 10 12 
0 0 1 
1 1 2 
2 2 3 

頂部現在我們只是需要GROUPBY的指數,像你這樣

df_concat.groupby(level=0).mean()

0 1 
0 5.0  5.5 
1 5.5  6.5 
2 6.0  7.5 

,然後用ExcelWriter作爲上下文經理

with pd.ExcelWriter(filepath, engine='openpyxl') as writer: 
    result.to_excel(writer) 

或只是簡單的

result.to_excel(filepath, engine='openpyxl') 

,如果你能覆蓋什麼是filepath

+0

這似乎產生一個系列,這並不完全符合我要找的 –

+0

我適應我的答案,現在你明確你需要什麼 –

+0

完美無缺,正是我一直在尋找的! –

1

我想你需要對每列的所有行的平均值。

將具有相同索引的數據幀列表連接起來會將其他數據幀的列添加到第一個數據幀的右側。如下所示:

 col1 col2 col3 col1 col2 col3 
    0  1  2  3  2  3  4 
    1  2  3  4  3  4  5 
    2  3  4  5  4  5  6 
    3  4  5  6  5  6  7 

嘗試附加數據幀,然後分組並按意義得到所需結果。

##creating data frames 
    df1= pd.DataFrame({'col1':[1,2,3,4], 
     'col2':[2,3,4,5], 
     'col3':[3,4,5,6]}) 

    df2= pd.DataFrame({'col1':[2,3,4,5], 
     'col2':[3,4,5,6], 
     'col3':[4,5,6,7]}) 

    ## list of data frames 
    dflist = [df1,df2] 

    ## empty data frame to use for appending 
    df=pd.DataFrame() 

    #looping through each item in list and appending to empty data frame 
    for i in dflist: 
     df = df.append(i) 

    # group by and calculating mean on index 
    data_mean=df.groupby(level=0).mean() 

寫入文件爲你寫

或者: 而不是使用一個for循環,你也可以提到沿着你要連接的數據幀軸附加的,在你的情況想要沿着索引(axis = 0)連接以將數據數據幀放在彼此頂部。如下圖所示:

 col1 col2 col3 
    0  1  2  3 
    1  2  3  4 
    2  3  4  5 
    3  4  5  6 
    0  2  3  4 
    1  3  4  5 
    2  4  5  6 
    3  5  6  7 

    ##creating data frames 
    df1= pd.DataFrame({'col1':[1,2,3,4], 
         'col2':[2,3,4,5], 
         'col3':[3,4,5,6]}) 

    df2= pd.DataFrame({'col1':[2,3,4,5], 
         'col2':[3,4,5,6], 
         'col3':[4,5,6,7]}) 

    ## list of data frames 
    dflist = [df1,df2] 

    #concat the dflist along axis 0 to put the data frames on top of each other 
    df_concat=pd.concat(dflist,axis=0) 

    # group by and calculating mean on index 
    data_mean=df_concat.groupby(level=0).mean() 

寫入文件爲你寫