如何将100个* csv文件的摘要统计信息与一个带有pandas的* csv结合起来?

时间:2017-04-06 06:12:07

标签: python csv pandas numpy dataframe

我有几百个* csv文件,当导入到pandas数据框时,如下所示:

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
5      3210       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 /值以及maxcolumn1的{​​{1}}值}。什么是最好的熊猫方式?

ID1 5891 3 ....

我的想法是:

column3

但是,(1)我不知道这是否有效;(2)我不知道最终csv的尺寸是否正确。另外,如何处理缺少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") column1的* csv?也就是说,它应该“传递”这些值。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

重复附加到pandas DataFrame的效率非常低,因为它会复制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')将替换缺失值。