与creating an empty dataframe and populating rows later不同,我有许多需要连接的数据帧。
如果只有两个数据框,我可以这样做:
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df1.append(df2, ignore_index=True)
想象一下,每当我将新文件读入DataFrame对象时,我都需要附加/连接数百万df
个import pandas as pd
alldf = pd.DataFrame(, columns=list('AB'))
for filename in os.listdir(indir):
df = pd.read_csv(indir+filename, delimiter=' ')
alldf.append(df, ignore_index=True)
。
但是当我尝试初始化空数据帧然后通过循环添加新数据帧时:
alldf
这将返回一个只有标题行的空alldf = pd.DataFrame(columns=list('AB'))
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
for df in [df1, df2]:
alldf.append(df, ignore_index=True)
,例如
log
答案 0 :(得分:2)
df.concat()
可能是要走的路,特别是对于干净的CSV。 但如果您怀疑自己的CSV是脏的,或者read_csv()
能够识别文件之间的混合类型,您可能希望明确地在循环中创建每个数据帧。
您可以初始化第一个文件的数据框,然后每个后续文件都以第一个文件的空数据框开头。
df2 = pd.DataFrame(data=None, columns=df1.columns,index=df1.index)
这将采用数据框df1
的结构但不包含数据,并创建df2
。如果要在列上强制数据类型,则可以在创建复制结构之前将其设置为df1
。
答案 1 :(得分:-1)
来自@DSM评论,这有效:
import pandas as pd
dfs = []
for filename in os.listdir(indir):
df = pd.read_csv(indir+filename, delimiter=' ')
dfs(df)
alldf = pd.concat(dfs)