2017-04-06 80 views
0

我有幾百* CSV文件,其中,當導入到大熊貓數據幀如下所示:如何將來自100個* csv文件的摘要統計信息與熊貓一個* csv結合使用?

import pandas as pd 
df = pd.read_csv("filename1.csv") 

df 
    column1 column2 column3 column4 
0  10  A   1  ID1 
1  15  A   1  ID1 
2  19  B   1  ID1 
3  5071  B   0  ID1 
4  5891  B   0  ID1 
    B   0  ID1 
6  12  B   2  ID1 
7  13  C   2  ID1 
8  20  C   0  ID1 
9   5  C   3  ID1 
10  9  C   3  ID1 

每個* csv文件具有用於column4一個唯一的ID(從而每一行具有相同的元素)。

我想創建一個新的CSV文件,其中每個文件名是一個行,保持從所述column4 ID /值和column1column3max值。什麼是最好的熊貓的方式來做到這一點?

ID1 5891 3 ....

我的想法是:

import numpy as np 
import pandas as pd 

files = glob.glob("*.csv") # within the correct subdirectory 

newdf1 = pd.DataFrame() 
for file in newdf1: 
    df = pd.read_csv(file) 
    df["ID"] = df.column4.unique() 
    df["max_column1"] = df.column2.max() 
    df["max_column3"] = df.column3.max() 
    newdf1 = newdf1.append(df, ignore_index=True) 

newdf1.to_csv("totalfile.csv") 

然而,(1)我不知道這是否是有效的;(2)我不知道知道最終csv的尺寸是否正確。另外,如何處理一個* csv丟失column1column3?也就是說,它應該「傳遞」這些值。

這樣做的正確方法是什麼?

回答

1

我想你可以通過文件循環,通過iatmax獲得第一值和追加到list

然後使用DataFrame構造並寫入文件。

files = glob.glob("*.csv") # within the correct subdirectory 

L = [] 
for file in files: 
    df = pd.read_csv(file) 
    u = df.column4.iat[0] 
    m1 = df.column1.max() 
    m2 = df.column3.max() 
    L.append({'ID':u,'max_column1':m1,'max_column3':m2}) 

newdf1 = pd.DataFrame(L) 
newdf1.to_csv("totalfile.csv") 

編輯:

L = [] 
for file in files: 
    print (file) 
    df = pd.read_csv(file) 
    #print (df) 

    m1, m2 = np.nan, np.nan 
    if df.columns.str.contains('column1').any(): 
     m1 = df.column1.max() 
    if df.columns.str.contains('column3').any(): 
     m2 = df.column3.max() 
    u = df.column4.iat[0] 

    L.append({'ID':u,'max_column1':m1,'max_column3':m2}) 

newdf1 = pd.DataFrame(L) 
+0

這將如何處理NA值,即如果某個csv文件不存在列? – ShanZhengYang

+0

嗯,所以如果column3丟失,那麼'max_column3'是NaN? – jezrael

+0

是的,一些* csv文件沒有colum1或column3。儘管每個人都有一個ID列4。 – ShanZhengYang

1

反覆附加到一個大熊貓DataFrame是因爲它複製數據幀效率非常低。
相反,您可以直接向結果文件中寫入找到的最大值。

files = glob.glob("*.csv") 
with open("totalfile.csv", "w") as fout: 
    for f in files: 
     df = pd.read_csv(f) 
     result = df.loc[:, ['column4', 'column2', 'column3']].max()\ 
      .fillna('pass').to_dict() 
     fout.write("{column4},{column2},{column3}\n".format(**result)) 

df.loc[:, ['column4', 'column2', 'column3']]將返回NaN充滿列缺少的列。這隻會在所有三列都丟失時纔會引發異常。

fill_na('pass')將取代遺漏值。

+0

這個for循環不會爲我運行。 'fout還有一個錯誤:' – ShanZhengYang

+0

@尚正陽對不起,現在修正了。 – shanmuga

相關問題