2016-08-14 129 views
1

我试图追加数据帧的值作为行,但它追加为列。我有32个文件,我想从第二列(称为dataset_code)中追加它。但它创造了32行和101列。我想要1列和3232行。Python Pandas Dataframe Append Rows

import pandas as pd 
import os 



source_directory = r'file_path' 

df_combined = pd.DataFrame(columns=["dataset_code"]) 

for file in os.listdir(source_directory): 
    if file.endswith(".csv"): 
      #Read the new CSV to a dataframe. 
      df = pd.read_csv(source_directory + '\\' + file) 
      df = df["dataset_code"] 
      df_combined=df_combined.append(df) 



print(df_combined) 
+1

确定列是一样的吗? from append' [docs](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html):“将其他行添加到此帧的末尾,返回新的对象,不在此框架中的列将作为新列添加。“ – DeepSpace

+0

是的,当我子集DF和打印它,它打印适当的列 – PyNoob

回答

6

你已经有两个非常好的答案,但让我提出一些建议。

  1. 如果你只想要dataset_code列,告诉pd.read_csv直接(usecols=['dataset_code'])而不是加载整个文件到内存只有立即子集数据框。
  2. 不是追加到最初为空的数据框,而是收集数据框列表,并在最后一次连接它们。将行添加到熊猫DataFrame是昂贵的(它必须创建一个全新的行),因此您的方法创建65个:一个在开始时,一个在读取每个文件时,一个在追加后面的每个文件时,甚至可以多于32个,与子集。我提出的方法只创造了其中的33个,并且是这种进口的常用成语。

下面是代码:

import os 
import pandas as pd 

source_directory = r'file_path' 

dfs = [] 
for file in os.listdir(source_directory): 
    if file.endswith(".csv"): 
     df = pd.read_csv(os.join.path(source_directory, file), 
         usecols=['dataset_code']) 
     dfs.append(df) 

df_combined = pd.concat(dfs) 
+0

谢谢阿尔贝托,我改变你的答案,因为这是更好的解决方案 – PyNoob

4

df["dataset_code"]Series,而不是一个DataFrame。由于您想要将一个DataFrame附加到另一个DataFrame,因此需要将Series对象更改为DataFrame对象。

>>> type(df) 
<class 'pandas.core.frame.DataFrame'> 
>>> type(df['dataset_code']) 
<class 'pandas.core.series.Series'> 

进行转换,这样做:

df = df["dataset_code"].to_frame() 
+0

嘿Nehal,这工作,谢谢你!但为什么它工作?你能帮我理解吗? – PyNoob

+0

@PyNoob我已经更新了答案。 –

3

或者,您可以创建具有双方括号内数据帧:

df = df[["dataset_code"]] 
+0

不错,谢谢你Parfait – PyNoob