为什么在追加Pandas Dataframe 时列顺序会改变?

pn9klfpd  于 2023-02-06  发布在  其他
关注(0)|答案(8)|浏览(247)

我想使用Python panda追加(合并)一个文件夹中的所有csv文件。
例如:假设文件夹有两个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。

n3schb8v

n3schb8v1#

试试这个...

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

ss2ws0br2#

从版本0.23.0开始,您可以阻止append()方法对最终追加的DataFrame进行排序。

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

nwnhqdif3#

我也遇到过同样的问题,而且很痛苦。我设法通过在源 Dataframe 被附加到最终 Dataframe 后重新组织列来解决它。它看起来像这样:

#!/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')

由于您的问题是从近两年前,我张贴的解决方案,为我工作的enyone其他谁也将面临类似的问题.

ni65a41a

ni65a41a4#

您可以使用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

qq24tv8q

qq24tv8q5#

我调整了代码如下。注解行。

#!/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)
xytpbqjk

xytpbqjk6#

请尝试:
df = df.append(pd.DataFrame(Added_rows).T)

myzjeezk

myzjeezk7#

如果您创建了 Dataframe ,并按照您想要的方式设置了列,那么append将符合此要求

df = pd.DataFrame(columns = ['d','b','a','c'])
df = df.append({'d': name,
                        'b': h,
                        'a': w,
                        'c': normal_size                        
                        }
                       , ignore_index=True,sort=False)
iqxoj9l9

iqxoj9l98#

all_data = all_data.append(df, ignore_index=True)
输入ignore_index=True,这样顺序就不会改变。默认值是False,所以你需要改变它。

相关问题