为什么在附加pandas数据帧时列顺序正在改变?

时间:2015-11-19 07:18:08

标签: python csv pandas

我想使用Python pandas将所有csv文件附加(合并)到文件夹中。

例如:Say文件夹有两个csv文件test1.csvtest2.csv,如下所示:

A_Id    P_Id    CN1         CN2         CN3
AAA     111     702         709         740
BBB     222     1727        1734        1778

A_Id    P_Id    CN1         CN2         CN3
CCC     333     710        750          750
DDD     444     180        734          778

所以我写的python脚本如下:

#!/usr/bin/python
import pandas as pd
import glob

all_data = pd.DataFrame()
for f in glob.glob("testfolder/*.csv"):
    df = pd.read_csv(f)
    all_data = all_data.append(df)

all_data.to_csv('testfolder/combined.csv')

虽然combined.csv似乎有所有附加的行,但它看起来如下:

      CN1       CN2         CN3    A_Id    P_Id
  0   710      750         750     CCC     333
  1   180       734         778     DDD     444     
  0   702       709         740     AAA     111
  1  1727       1734        1778    BBB     222

它应该如下所示:

A_ID   P_Id   CN1    CN2    CN2
AAA    111    702    709    740
BBB    222    1727   1734   1778
CCC    333    110    356    123
DDD    444    220    256    223
  • 为什么前两列移到了最后?
  • 为什么会在第一行而不是最后一行追加?

我错过了什么?如何在第一列中获得0和1?

P.S:由于这些是大型csv文件,我想到了使用pandas。

6 个答案:

答案 0 :(得分:13)

试试这个......

all_data = all_data.append(df)[df.columns.tolist()]

答案 1 :(得分:4)

我有同样的问题而且很痛苦。我设法通过在将列附加到最终数据帧之后根据源数据帧重新组织列来解决它。它看起来像这样:

#!/usr/bin/python
import pandas as pd
import glob

all_data = pd.DataFrame()
for f in glob.glob("testfolder/*.csv"):
    df = pd.read_csv(f)
    all_data = all_data.append(df)
    all_data = all_data[df.columns]

all_data.to_csv('testfolder/combined.csv') 

由于您的问题来自差不多两年前,我发布的解决方案对我来说也适用于其他也将面临类似问题的人。

答案 2 :(得分:3)

您可以使用reindex更改为原始顺序:

all_data = all_data.append(df)
all_data = all_data.reindex(df.columns, axis=1)

我在这里看到了这个(链接中有更多详细信息):https://github.com/pandas-dev/pandas/issues/4588#issuecomment-44421883

答案 3 :(得分:1)

我调整了以下代码。评论内联。

#!/usr/bin/python
import pandas as pd
import glob

# Grab all the csv files in the folder to a list.
fileList = glob.glob('input_folder/*.csv')

#Initialize an empty dataframe to grab the csv content.
all_data = pd.DataFrame()

#Initialize an empty list to grab the dataframes.
dfList= []

for files in  fileList:
    df =  pd.read_csv(files, index_col = None, header= False)
    dfList.append(df)

#The frames will be in reverse order i.e last read file's content in the begining. So reverse it again
Reversed_dfList =  dfList[::-1]
CombinedFrame =  pd.concat(Reversed_dfList)

# The "Combined.csv" file will have combination of all the files.
CombinedFrame.to_csv('output_folder/Combined.csv', index=False)

答案 4 :(得分:1)

从0.23.0版开始,您可以阻止append()方法对最后附加的DataFrame进行排序。就您而言:

all_data = all_data.append(df, sort=False)

答案 5 :(得分:-1)

all_data = all_data.append(df, ignore_index=True)

设置 ignore_index=True 以便顺序不会改变。 默认情况下为 False,因此您需要更改它。