你能否阻止df.append()自动按字母顺序排序?

8
我正在尝试将数据附加到日志中,其中列的顺序不是按字母顺序排列,而是具有逻辑意义,例如。
Org_Goals_1  Calc_Goals_1  Diff_Goals_1   Org_Goals_2 Calc_Goals_2 Diff_Goals_2 

我正在根据不同的变量进行多个计算,并通过附加一个值字典来记录每次运行的结果。是否有方法可以防止df.append()函数按字母顺序排序列?

3个回答

4
似乎您需要在追加操作后重新排序列:
In [25]:
# assign the appended dfs to merged
merged = df1.append(df2)
# create a list of the columns in the order you desire
cols = list(df1) + list(df2)
# assign directly
merged.columns = cols
# column order is now as desired
merged.columns
Out[25]:
Index(['Org_Goals_1', 'Calc_Goals_1', 'Diff_Goals_1', 'Org_Goals_2', 'Calc_Goals_2', 'Diff_Goals_2'], dtype='object')

例子:

In [26]:

df1 = pd.DataFrame(columns=['Org_Goals_1','Calc_Goals_1','Diff_Goals_1'], data = randn(5,3))
df2 = pd.DataFrame(columns=['Org_Goals_2','Calc_Goals_2','Diff_Goals_2'], data=randn(5,3))
merged = df1.append(df2)
cols = list(df1) + list(df2)
merged.columns = cols
merged
Out[26]:
   Org_Goals_1  Calc_Goals_1  Diff_Goals_1  Org_Goals_2  Calc_Goals_2  \
0     0.028935           NaN     -0.687143          NaN      1.528579   
1     0.943432           NaN     -2.055357          NaN     -0.720132   
2     0.035234           NaN      0.020756          NaN      1.556319   
3     1.447863           NaN      0.847496          NaN     -1.458852   
4     0.132337           NaN     -0.255578          NaN     -0.222660   
0          NaN      0.131085           NaN     0.850022           NaN   
1          NaN     -1.942110           NaN     0.672965           NaN   
2          NaN      0.944052           NaN     1.274509           NaN   
3          NaN     -1.796448           NaN     0.130338           NaN   
4          NaN      0.961545           NaN    -0.741825           NaN   

   Diff_Goals_2  
0           NaN  
1           NaN  
2           NaN  
3           NaN  
4           NaN  
0      0.727619  
1      0.022209  
2     -0.350757  
3      1.116637  
4      1.947526  

相同的 alpha 排序也会在 concat 中发生,因此在添加后似乎必须重新排序。
编辑:
另一种选择是使用 join:
In [32]:

df1.join(df2)
Out[32]:
   Org_Goals_1  Calc_Goals_1  Diff_Goals_1  Org_Goals_2  Calc_Goals_2  \
0     0.163745      1.608398      0.876040     0.651063      0.371263   
1    -1.762973     -0.471050     -0.206376     1.323191      0.623045   
2     0.166269      1.021835     -0.119982     1.005159     -0.831738   
3    -0.400197      0.567782     -1.581803     0.417112      0.188023   
4    -1.443269     -0.001080      0.804195     0.480510     -0.660761   

   Diff_Goals_2  
0     -2.723280  
1      2.463258  
2      0.147251  
3      2.328377  
4     -0.248114  

“join” 做你想要的事情,我认为除了它可能或可能不是你想要的索引对齐之外。 - EdChum
我实际上使用了这个:Log=Log.append(Summary) Log.columns=col_list 然而,现在值似乎与正确的列名不对应...就好像标题在正确的位置,但数据不在... - Alexis Perez
@AlexisPerez 我看到你的问题了,join似乎保留了列名和数据顺序。 - EdChum
@AlexisPerez 我觉得这里发生了一些微妙的情况,因为通常重新排序列顺序也会重新排序数据,但现在并没有发生这种情况,就好像 NaN 列在列排序中引起了一些混乱。 - EdChum

4
实际上,我发现"高级索引"效果相当不错。
df2=df.ix[:,'order of columns']

我本来想尝试这个方法,因为这是重新排序列的另一种方式,但由于其他方法失败了,所以我没有尝试。不过,直接赋值为什么会产生奇怪的结果,我觉得很奇怪。 - EdChum
@alexisperez 我只是想要补充一下(为了更清晰),你的答案中的虚拟文本最好改成df2=df.ix[:, ['order','of','columns']]。也就是说,应该提供一个列表而不是一个字符串。尽管如此,我仍然为你的简洁回答点赞。 - semore_1267

0

在我看来,顺序已经丢失了,但是在添加时,原始数据应该具有正确的顺序。为了保持这一点,假设DataFrame 'alldata'和要附加的DataFrame 'newdata',将附加并保持与'alldata'中列顺序相同:

alldata.append(newdata)[list(alldata)]

我遇到了一个有关命名日期字段的问题,其中“Month”会在“Minute”和“Second”之间排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接