将pandas数据框按另一个数据框中的列排序-pandas

问题描述 投票:0回答:2

假设我有一个带有两列的Pandas DataFrame,例如:

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

有什么方法可以实现?

请在下面检查自我回答。

python pandas dataframe sorting series
2个回答
1
投票

关于:

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

0
投票

我经常遇到这些问题,所以我只是想在Pandas中分享我的解决方案。

解决方案:

解决方案1:

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

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创建一个新的DataFrame对象,然后将sortedkey参数一起使用,以按s系列对DataFrame进行排序:

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也有一个很好的答案。

© www.soinside.com 2019 - 2024. All rights reserved.