通过重新排列一列来重新排列数据框

时间:2018-09-07 14:27:34

标签: python pandas sorting dataframe indexing

具有如下所示的数据框:

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])

3 个答案:

答案 0 :(得分:2)

您可以通过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

答案 1 :(得分:1)

您可以使用已排序函数中的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

通过更改key的值,可以设置所需的顺序。

更新

如果要根据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

答案 2 :(得分:1)

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

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

对于所有列,请使用:

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

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