【问题标题】:Reorder your dataframe by reordering one column通过重新排序一列重新排序您的数据框
【发布时间】:2019-02-12 22:21:32
【问题描述】:

有一个如下所示的数据框:

import pandas as pd 

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])

我想知道当一列中的顺序不同而希望应用于所有其他列时如何重新排列数据框,例如在本例中更改了 A 列?

 df2 = pd.DataFrame({'A': ['A3', 'A0', 'A2', 'A1'],
                     'B': ['B3', 'B0', 'B2', 'B1'],
                     'C': ['C3', 'C0', 'C2', 'C1'],
                     'D': ['D3', 'D0', 'D2', 'D1']},
                     index=[0, 1, 2, 3])

【问题讨论】:

  • df2 是最终结果还是您希望 df2 的索引 1、2、3 排序为 df2 索引 0?
  • 对不起,它在我完成编辑之前发布。我希望所有的列都根据 A 改变顺序

标签: python pandas sorting dataframe indexing


【解决方案1】:

您可以通过set_indexreindexreset_index 使用索引。假设您在 A 中的值是唯一的,这是唯一可以进行此类转换的情况。

L = ['A3', 'A0', 'A2', 'A1']

res = df1.set_index('A').reindex(L).reset_index()

print(res)

    A   B   C   D
0  A3  B3  C3  D3
1  A0  B0  C0  D0
2  A2  B2  C2  D2
3  A1  B1  C1  D1

【讨论】:

    【解决方案2】:

    您的意思是对 1 个特定行进行排序吗?如果是这样,请使用:

    df1.iloc[:1] = df1.iloc[:1].sort_index(axis=1,ascending=False)
    print(df1)
    

    所有列使用:

    df1 = df1.sort_index(axis=0,ascending=False)
    

    对于特定的列,使用 iloc 函数。

    【讨论】:

    • 是的,第二个选项是我应该得到的,对不起,我的网络把帖子搞砸了几分钟。
    • 没问题。希望有帮助。 :)
    【解决方案3】:

    您可以使用 sorted 函数中的 key 参数:

    import pandas as pd
    
    df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                       index=[0, 1, 2, 3])
    
    
    key = {'A3': 0, 'A0': 1, 'A2' : 2, 'A1': 3}
    df1['A'] = sorted(df1.A, key=lambda e: key.get(e, 4))
    
    print(df1)
    

    输出

        A   B   C   D
    0  A3  B0  C0  D0
    1  A0  B1  C1  D1
    2  A2  B2  C2  D2
    3  A1  B3  C3  D3
    

    通过改变键的值,你可以设置任何你想要的顺序。

    更新

    如果您想要根据A 的新顺序更改其他列的顺序,您可以尝试以下操作:

    df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                       index=[0, 1, 2, 3])
    
    df2 = pd.DataFrame({'A': ['A3', 'A0', 'A2', 'A1'],
                        'B': ['B0', 'B1', 'B2', 'B3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']},
                       index=[0, 1, 2, 3])
    
    key = [df1.A.values.tolist().index(k) for k in df2.A]
    df2.B = df2['B'][key].tolist()
    print(df2)
    

    输出

        A   B   C   D
    0  A3  B3  C0  D0
    1  A0  B0  C1  D1
    2  A2  B2  C2  D2
    3  A1  B1  C3  D3
    

    要更改所有列,只需对每列应用上述内容。是这样的:

    for column in df2.columns.values:
        if column != 'A':
            df2[column] = df2[column][key].tolist()
    print(df2)
    

    输出

        A   B   C   D
    0  A3  B3  C3  D3
    1  A0  B0  C0  D0
    2  A2  B2  C2  D2
    3  A1  B1  C1  D1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 2018-11-27
      • 2019-01-23
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多