2017-04-06 100 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

相关问题