【问题标题】:Can you prevent automatic alphabetical order of df.append()?你能阻止 df.append() 的自动字母顺序吗?
【发布时间】:2015-03-01 04:55:15
【问题描述】:

我正在尝试将数据附加到列的顺序不是按字母顺序但合乎逻辑的日志中,例如。

Org_Goals_1  Calc_Goals_1  Diff_Goals_1   Org_Goals_2 Calc_Goals_2 Diff_Goals_2 

我正在运行基于不同变量的多个计算,并通过在每次运行后附加一个值字典来记录结果。有没有办法防止 df.append() 函数按字母顺序排列列?

【问题讨论】:

    标签: pandas append alphabetical


    【解决方案1】:

    似乎您必须在附加操作之后重新排序列:

    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  
    

    concat 也会对列进行相同的 alpha 排序,因此看起来您必须在追加后重新排序。

    编辑

    另一种方法是使用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 做你想做的事,除了它在索引上对齐,这可能是也可能不是你想要的
    • 我实际上使用了这个:Log=Log.append(Summary) Log.columns=col_list 但是,这些值现在似乎与正确的列名不对应......就像标题一样位置正确,但数据不正确..
    • @AlexisPerez 我看到了你的问题,加入似乎保留了列名和数据顺序
    • @AlexisPerez 我认为这里发生了一些微妙的事情,因为通常重新排序列顺序也会重新排序数据,但这没有发生,就好像 NaN 列在排序中造成了一些混乱列
    【解决方案2】:

    实际上,我发现“高级索引”效果很好

    df2=df.ix[:,'order of columns']
    

    【讨论】:

    • 我打算试试这个,因为这是另一种方式或重新排序列,但由于其他方法失败而没有尝试,奇怪的是为什么直接分配会产生有趣的结果,尽管 IMO 跨度>
    • @alexisperez 我只想补充一点(为了清楚起见),如果将答案的虚拟文本更改为df2=df.ix[:, ['order','of','columns']],它会更好。即,提供列表而不是字符串。不过,为了简洁起见,您仍然对您的答案投了赞成票。
    【解决方案3】:

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

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

    (我在命名日期字段中遇到了这个问题,其中“月份”将在“分钟”和“秒”之间排序)

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 2010-11-21
      • 2018-06-28
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2010-12-24
      相关资源
      最近更新 更多