Pandas:使用循环和分层索引将多个csv文件导入数据框

时间:2014-01-15 22:48:37

标签: python csv pandas hierarchical-data

我想从目标目录中读取多个CSV文件(列数不同)到单个Python Pandas DataFrame中,以便有效地搜索和提取数据。

示例文件:

Events 
1,0.32,0.20,0.67
2,0.94,0.19,0.14,0.21,0.94
3,0.32,0.20,0.64,0.32
4,0.87,0.13,0.61,0.54,0.25,0.43 
5,0.62,0.21,0.77,0.44,0.16

这是我到目前为止所做的:

# get a list of all csv files in target directory
my_dir = "C:\\Data\\"
filelist = []
os.chdir( my_dir )
for files in glob.glob( "*.csv" ) :
    filelist.append(files)

# read each csv file into single dataframe and add a filename reference column 
# (i.e. file1, file2, file 3) for each file read
df = pd.DataFrame()
columns = range(1,100)
for c, f in enumerate(filelist) :
    key = "file%i" % c
    frame = pd.read_csv( (my_dir + f), skiprows = 1, index_col=0, names=columns )
    frame['key'] = key
    df = df.append(frame,ignore_index=True)

(索引无法正常工作)

基本上,下面的脚本正是我想要的(尝试和测试过),但需要通过10个或更多csv文件循环:

df1 = pd.DataFrame()
df2 = pd.DataFrame()
columns = range(1,100)
df1 = pd.read_csv("C:\\Data\\Currambene_001y09h00m_events.csv", 
                  skiprows = 1, index_col=0, names=columns)
df2 = pd.read_csv("C:\\Data\\Currambene_001y12h00m_events.csv", 
                  skiprows = 1, index_col=0, names=columns)
keys = [('file1'), ('file2')]
df = pd.concat([df1, df2], keys=keys, names=['fileno'])

我找到了许多相关的链接,但是我仍然无法使其工作:

1 个答案:

答案 0 :(得分:15)

您需要决定要在哪个轴上附加文件。熊猫总会尝试通过以下方式做正确的事:

  1. 假设每个文件中的每一列都不同,并在必要时将数字附加到文件中具有相似名称的列,以便它们不会混合;
  2. 跨文件属于同一行索引的项目并排放置在各自的列下。
  3. 有效追加的技巧是侧向提示文件,因此您可以获得所需的行为以匹配pandas.concat将要执行的操作。这是我的食谱:

    from pandas import *
    files = !ls *.csv # IPython magic
    d = concat([read_csv(f, index_col=0, header=None, axis=1) for f in files], keys=files)
    

    请注意,read_csvaxis=1一起转置,因此它将在列轴上连接,并保留其名称。如果需要,可以使用d.T转换生成的DataFrame。

    修改

    对于每个源文件中的不同列数,您需要提供标头。我知道你的源文件中没有标题,所以让我们用一个简单的函数创建一个标题:

    def reader(f):
        d = read_csv(f, index_col=0, header=None, axis=1)
        d.columns = range(d.shape[1])
        return d
    
    df = concat([reader(f) for f in files], keys=files)