pandas.concat 中的列顺序
Column order in pandas.concat
我做的如下:
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
data
a b
0 2 1
1 2 1
2 2 1
0 2 1
1 2 1
2 2 1
数据列顺序为字母顺序。为什么会这样?
以及如何保持原来的顺序?
您正在从字典中创建 DataFrame。字典是无序的,这意味着键没有特定的顺序。所以
d1 = {'key_a': 'val_a', 'key_b': 'val_b'}
和
d2 = {'key_b': 'val_b', 'key_a': 'val_a'}
(可能)相同。
除此之外,我假设 pandas 默认情况下对字典的键进行降序排序(不幸的是,我没有在文档中找到任何提示来证明该假设)导致您遇到的行为。
所以基本动机是对 DataFrame 中的列求助/重新排序。你可以这样做 as follows:
import pandas as pd
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
print(data)
cols = ['b' , 'a']
data = data[cols]
print(data)
您可以使用 OrderedDicts 创建原始 DataFrame
from collections import OrderedDict
odict = OrderedDict()
odict['b'] = [1, 1, 1]
odict['a'] = [2, 2, 2]
data1 = pd.DataFrame(odict)
data2 = pd.DataFrame(odict)
frames = [data1, data2]
data = pd.concat(frames)
data
b a
0 1 2
1 1 2
2 1 2
0 1 2
1 1 2
2 1 2
def concat_ordered_columns(frames):
columns_ordered = []
for frame in frames:
columns_ordered.extend(x for x in frame.columns if x not in columns_ordered)
final_df = pd.concat(frames)
return final_df[columns_ordered]
# Usage
dfs = [df_a,df_b,df_c]
full_df = concat_ordered_columns(dfs)
这应该有效。
您也可以这样指定顺序:
import pandas as pd
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
listdf = [data1, data2]
data = pd.concat(listdf)
sequence = ['b','a']
data = data.reindex(columns=sequence)
从0.23.0版本开始,可以禁止concat()方法对返回的DataFrame进行排序。例如:
df1 = pd.DataFrame({ 'a' : [1, 1, 1], 'b' : [2, 2, 2]})
df2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
df = pd.concat([df1, df2], sort=False)
pandas 的未来版本将更改为默认不排序。
最简单的方法是首先使列的顺序相同,然后连接:
df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)
我做的如下:
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
data
a b
0 2 1
1 2 1
2 2 1
0 2 1
1 2 1
2 2 1
数据列顺序为字母顺序。为什么会这样? 以及如何保持原来的顺序?
您正在从字典中创建 DataFrame。字典是无序的,这意味着键没有特定的顺序。所以
d1 = {'key_a': 'val_a', 'key_b': 'val_b'}
和
d2 = {'key_b': 'val_b', 'key_a': 'val_a'}
(可能)相同。
除此之外,我假设 pandas 默认情况下对字典的键进行降序排序(不幸的是,我没有在文档中找到任何提示来证明该假设)导致您遇到的行为。
所以基本动机是对 DataFrame 中的列求助/重新排序。你可以这样做 as follows:
import pandas as pd
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
frames = [data1, data2]
data = pd.concat(frames)
print(data)
cols = ['b' , 'a']
data = data[cols]
print(data)
您可以使用 OrderedDicts 创建原始 DataFrame
from collections import OrderedDict
odict = OrderedDict()
odict['b'] = [1, 1, 1]
odict['a'] = [2, 2, 2]
data1 = pd.DataFrame(odict)
data2 = pd.DataFrame(odict)
frames = [data1, data2]
data = pd.concat(frames)
data
b a
0 1 2
1 1 2
2 1 2
0 1 2
1 1 2
2 1 2
def concat_ordered_columns(frames):
columns_ordered = []
for frame in frames:
columns_ordered.extend(x for x in frame.columns if x not in columns_ordered)
final_df = pd.concat(frames)
return final_df[columns_ordered]
# Usage
dfs = [df_a,df_b,df_c]
full_df = concat_ordered_columns(dfs)
这应该有效。
您也可以这样指定顺序:
import pandas as pd
data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
listdf = [data1, data2]
data = pd.concat(listdf)
sequence = ['b','a']
data = data.reindex(columns=sequence)
从0.23.0版本开始,可以禁止concat()方法对返回的DataFrame进行排序。例如:
df1 = pd.DataFrame({ 'a' : [1, 1, 1], 'b' : [2, 2, 2]})
df2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]})
df = pd.concat([df1, df2], sort=False)
pandas 的未来版本将更改为默认不排序。
最简单的方法是首先使列的顺序相同,然后连接:
df2=df2[df1.columns]
df=pd.concat((df1,df2),axis=0)