按另一个数据框中的列对数据框进行排序

2024-04-20 07:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个包含两列的Pandas数据框,如:

df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [100, 200, 300, 400]})
print(df)

   a    b
0  1  100
1  2  200
2  3  300
3  4  400

假设我还有一个熊猫系列,比如:

s = pd.Series([1, 3, 2, 4])
print(s)

0    1
1    3
2    2
3    4
dtype: int64

如何将a列排序为与s系列相同的顺序,并将相应的行值排序在一起

我期望的结果是:

   a    b
0  1  100
1  3  300
2  2  200
3  4  400

有没有办法做到这一点

请检查下面的自我回答。


Tags: 数据dataframepandasdf排序顺序seriespd
2条回答

我经常遇到这些问题,所以我只是想和大家分享一下我的解决方案

解决方案:

解决方案1:

使用set_indexa列转换为索引,然后使用reindex更改顺序,然后使用rename_axis将索引名称更改回a,然后使用reset_indexa列从索引转换回列:

print(df.set_index('a').reindex(s).rename_axis('a').reset_index('a'))

解决方案2:

使用set_indexa列转换为索引,然后使用loc更改顺序,然后使用reset_indexa列从索引转换回列:

print(df.set_index('a').loc[s].reset_index())

解决方案3:

使用iloc以不同的顺序对行进行索引,然后使用map获得适合df的顺序,以使其与s系列一起排序:

print(df.iloc[list(map(df['a'].tolist().index, s))])

解决方案4:

使用pd.DataFrame创建新的数据帧对象,然后使用sortedkey参数按s系列对数据帧进行排序:

print(pd.DataFrame(sorted(df.values.tolist(), key=lambda x: s.tolist().index(x[0])), columns=df.columns))

时间:

使用以下代码计时:

import pandas as pd
from timeit import timeit
df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [100, 200, 300, 400]})
s = pd.Series([1, 3, 2, 4])
def u10_1():
    return df.set_index('a').reindex(s).rename_axis('a').reset_index('a')
def u10_2():
    return df.set_index('a').loc[s].reset_index()
def u10_3():
    return df.iloc[list(map(df['a'].tolist().index, s))]
def u10_4():
    return pd.DataFrame(sorted(df.values.tolist(), key=lambda x: s.tolist().index(x[0])), columns=df.columns)
print('u10_1:', timeit(u10_1, number=1000))
print('u10_2:', timeit(u10_2, number=1000))
print('u10_3:', timeit(u10_3, number=1000))
print('u10_4:', timeit(u10_4, number=1000))

输出:

u10_1: 3.012849470495621
u10_2: 3.072132612502147
u10_3: 0.7498072134665241
u10_4: 0.8109911930595484

@Allen也有一个很好的答案

那么:

(
    df.assign(s=s)
    .sort_values(by='s')
    .drop('s', axis=1)
)

相关问题 更多 >