簡體   English   中英

按另一個數據幀中的列對熊貓數據幀進行排序 - 熊貓

[英]Sort a pandas DataFrame by a column in another dataframe - pandas

假設我有一個包含兩列的 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

假設我還有一個 Pandas 系列,例如:

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

有沒有辦法實現這一目標?

請檢查下面的自我回答。

關於什么:

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

我經常遇到這些問題,所以我只是想在 Pandas 中分享我的解決方案。

解決方案:

解決方案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創建一個新的 DataFrame 對象,然后使用sorted with a key參數按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 也有一個很好的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM