![](/img/trans.png)
[英]How to sort one column based on another column in Pandas Dataframe?
[英]how to sort pandas dataframe from one column
我有一個這樣的數據框:
print(df)
0 1 2
0 354.7 April 4.0
1 55.4 August 8.0
2 176.5 December 12.0
3 95.5 February 2.0
4 85.6 January 1.0
5 152 July 7.0
6 238.7 June 6.0
7 104.8 March 3.0
8 283.5 May 5.0
9 278.8 November 11.0
10 249.6 October 10.0
11 212.7 September 9.0
如您所見,月份不是按日歷順序排列的。 所以我創建了第二列來獲取與每個月 (1-12) 對應的月份編號。 從那里,我如何根據日歷月的順序對這個數據框進行排序?
使用sort_values
按特定列的值對 df 進行排序:
In [18]:
df.sort_values('2')
Out[18]:
0 1 2
4 85.6 January 1.0
3 95.5 February 2.0
7 104.8 March 3.0
0 354.7 April 4.0
8 283.5 May 5.0
6 238.7 June 6.0
5 152.0 July 7.0
1 55.4 August 8.0
11 212.7 September 9.0
10 249.6 October 10.0
9 278.8 November 11.0
2 176.5 December 12.0
如果要按兩列排序,請將列標簽列表傳遞給sort_values
,列標簽根據排序優先級排序。 如果您使用df.sort_values(['2', '0'])
,則結果將按2
列然后按第0
列排序。 誠然,這對於這個例子來說並沒有什么意義,因為df['2']
中的每個值都是唯一的。
我嘗試了上面的解決方案,但沒有取得結果,所以我找到了一個適合我的不同解決方案。 ascending=False
是對 dataframe 進行降序排序,默認為True
。 我正在使用 python 3.6.6 和 pandas 0.23.4 版本。
final_df = df.sort_values(by=['2'], ascending=False)
您可以在此處的 pandas 文檔中查看更多詳細信息。
使用列名對我有用。
sorted_df = df.sort_values(by=['Column_name'], ascending=True)
就像另一個解決方案一樣:
您可以對字符串數據(月份名稱)進行分類並按如下方式排序,而不是創建第二列:
df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)
它將按照您在創建Categorical
object 時指定的month name
為您提供排序數據。
Panda 的sort_values
可以完成這項工作。
如果打算保持相同的變量名,請不要忘記inplace=True
(這會就地執行操作)
df.sort_values(by=['2'], inplace=True)
不妨將更改(排序)分配給一個變量,該變量可能具有相同的名稱,例如df
為
df = df.sort_values(by=['2'])
忘記上述步驟可能會導致(作為此用戶)無法獲得預期的結果。
請注意,如果要按降序排列,則需要傳遞ascending=False
,例如
df = df.sort_values(by=['2'], ascending=False)
只是在數據上添加更多操作。 假設我們有一個 dataframe df
,我們可以做幾個操作來獲得想要的輸出
ID cost tax label
1 216590 1600 test
2 523213 1800 test
3 250 1500 experiment
(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)
將sorted
output 標簽作為dataframe
index label
0 test 2
1 experiment 1
這對我有用
df.sort_values(by='Column_name', inplace=True, ascending=False)
您可能需要在排序后重置索引:
df = df.sort_values('2')
df = df.reset_index(drop=True)
這是根據 pandas 文檔的 sort_values 模板。
DataFrame.sort_values(by, axis=0,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
ignore_index=False, key=None)[source]
在這種情況下,它將是這樣的。
df.sort_values(by=['2'])
如果您想對列進行動態排序而不是按字母順序排序。 並且不想使用 pd.sort_values()。 您可以嘗試以下解決方案。
問題:按此序列 ['A', 'C', 'D', 'B'] 對列“col1”進行排序
import pandas as pd
import numpy as np
## Sample DataFrame ##
df = pd.DataFrame({'col1': ['A', 'B', 'D', 'C', 'A']})
>>> df
col1
0 A
1 B
2 D
3 C
4 A
## Solution ##
conditions = []
values = []
for i,j in enumerate(['A','C','D','B']):
conditions.append((df['col1'] == j))
values.append(i)
df['col1_Num'] = np.select(conditions, values)
df.sort_values(by='col1_Num',inplace = True)
>>> df
col1 col1_Num
0 A 0
4 A 0
3 C 1
2 D 2
1 B 3
只需添加更多見解
df=raw_df['2'].sort_values() # will sort only one column (i.e 2)
但,
df =raw_df.sort_values(by=["2"] , ascending = False) # this will sort the whole df in decending order on the basis of the column "2"
這個對我有用:
df=df.sort_values(by=[2])
然而:
df=df.sort_values(by=['2'])
不管用。
示例:假設您有一個值為 1 和 0 的列,並且您想分離並只使用一個值,那么:
// furniture is one of the columns in the csv file.
allrooms = data.groupby('furniture')['furniture'].agg('count')
allrooms
myrooms1 = pan.DataFrame(allrooms, columns = ['furniture'], index = [1])
myrooms2 = pan.DataFrame(allrooms, columns = ['furniture'], index = [0])
print(myrooms1);print(myrooms2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.