2016-09-10 15 views
2

データフレームの1番目と2番目の列の名前をアルファベット順に並べ替えることができません。データフレーム(パンダ)の列をソート/アルファベット順に並べ替え

データフレームは、このようなものになります。

  Boys  Females 
Rank       
1   Michael Jennifer 
2  Christopher Jessica 
3   Matthew  Amanda 
4   Jason  Sarah 
5   David Melissa 
6   Joshua  Amy 
7   James  Nicole 
8   John Stephanie 
9   Robert Elizabeth 
10   Daniel Heather 
11   Joseph Michelle 
12   Justin Rebecca 
13   Ryan Kimberly 
14   Brian Tiffany 

を、私はそれは次のようになりたい:私は周りにプレイした

Rank  Boys     Rank Females 
14  Brian     3  Amanda 
    2  Christopher   6  Amy 
10  Daniel     9  Elizabeth 
    5  David     10  Heather 
    7  James     1  Jennifer 

(少年と女性の名前はアルファベット順になっています) sortとsort_valueの列は変更されません。ここに私の元のコードです

import pandas as pd 



df = pd.read_html("file:///C:/Python27/babyname999.html") 

df2 =df[0] # creating a data frame from the above list of dateframes 

df2.rename(columns = {'0': 'Rank', '1': 'Boys', '2': 'Females'}, inplace = True) 
del df2['Unnamed: 0'] 

#renaming columns of dataframe 


df2.set_index('Rank', inplace = True) #setting index of dataframe to 'Rank' 

私はソートとsort_valueで遊んだが、列は変化していません。私はどこにもいない。助言がありますか?

ありがとうございます!

+0

のために尋ね、それが何なのかはっきりしていないので、次に

df.apply(lambda x: x.sort_values().values) 

enter image description here


は、近くに何かを得るために、あなたは達成しようとしていますか? – MaxU

+0

こんにちは、混乱のために申し訳ありません。 Boysのコラムでは、ブライアンを最初に見て、アルファベット順にアルファベット順にアルファベット順に並べていきたいと思っています。女性の側では、エイミーをトップにして、リストをアルファベット順に続けてください。少年と女性の両方を同時にアルファベット順に欲しいと思います。 ランクはそのランクに従います。だからソート後、マイケルはリストの真ん中にいるだろうが、彼はまだランク "1"を保持するだろう。 – Moondra

+0

女性のアルファベット順の別のランクの列が必要です。 今は意味がありますか?混乱させて申し訳ありません。 – Moondra

答えて

2

別のcol独立したソートされた列のインデックスを使用して並べ替えるだけで、並べ替え作業が損なわれるということです。代わりに、ソートされたシリーズの値をソートして返す必要があります。十分な話をしてください。例でもっと詳しく説明します。

dfがデータフレームの例であるとします。あなたがあなたの目的のデータセットを投稿することができます

lst = [df[c].sort_values().reset_index(name='Name') for c in df] 
keys = df.columns 
pd.concat(lst, axis=1, keys=keys) 

enter image description here

+0

これは完璧です。あなたのコードを見て、さらに質問があるかどうかを確認します。 – Moondra

3

ここでは、ソートの動作例を示します。

import pandas as pd 
from io import StringIO 

data_file = StringIO(u"""Rank  Boys  Females 
1   Michael Jennifer 
2  Christopher Jessica 
3   Matthew  Amanda 
4   Jason  Sarah 
5   David Melissa 
6   Joshua  Amy 
7   James  Nicole 
8   John Stephanie 
9   Robert Elizabeth 
10   Daniel Heather 
11   Joseph Michelle 
12   Justin Rebecca 
13   Ryan Kimberly 
14   Brian Tiffany""") 

df = pd.read_table(data_file, delim_whitespace=True) 

boys = df[['Rank','Boys']].sort_values(['Boys']).rename(columns={'Rank': 'Rank_boys'}) 
females = df[['Rank','Females']].sort_values(['Females']).rename(columns={'Rank': 'Rank_females'}) 
result = pd.concat([boys.reset_index(drop=True), females.reset_index(drop=True)], axis=1) 

、結果は次のようになります。

Rank_boys Boys Rank_females Females 
0 14 Brian 3 Amanda 
1 2 Christopher 6 Amy 
2 10 Daniel 9 Elizabeth 
3 5 David 10 Heather 
4 7 James 1 Jennifer 
5 4 Jason 2 Jessica 
6 8 John 13 Kimberly 
7 11 Joseph 5 Melissa 
8 6 Joshua 11 Michelle 
9 12 Justin 7 Nicole 
10 3 Matthew 12 Rebecca 
11 1 Michael 4 Sarah 
12 9 Robert 8 Stephanie 
13 13 Ryan 14 Tiffany 
+0

はい、これは私が男の子と女性の列で同時に行うことです。 私はあなたのコードを見て、質問があるかどうか確認します。おかげさまで – Moondra

+0

あなたのコードを見た後、私は女性のための別のランクの列を作成する必要があるようだ。私はStringIOモジュールに精通していないので、私はそれを読み上げる必要があります。 – Moondra

+0

StringIOは、質問のデータサンプルからデータフレームを作成するためのものです。 – grubjesic

2

IIUC(あなたが投稿していなかったDF希望/予想通り、それは難しい)あなたはこのようにそれを行うことができます。

df = (pd.read_html("file:///C:/Python27/babyname999.html")[0] 
     .rename(columns = {'0': 'Rank', '1': 'Boys', '2': 'Females'}) 
     .drop('Unnamed: 0', 1) 
     .set_index('Rank') 
) 

、その後:

In [86]: df['Rank_Boys'], df['Rank_Females'] = df.sort_values('Boys').index, df.sort_values('Females').index 

In [87]: df 
Out[87]: 
      Boys Females Rank_Boys Rank_Females 
1  Michael Jennifer   14    3 
2 Christopher Jessica   2    6 
3  Matthew  Amanda   10    9 
4   Jason  Sarah   5   10 
5   David Melissa   7    1 
6  Joshua  Amy   4    2 
7   James  Nicole   8   13 
8   John Stephanie   11    5 
9  Robert Elizabeth   6   11 
10  Daniel Heather   12    7 
11  Joseph Michelle   3   12 
12  Justin Rebecca   1    4 
13   Ryan Kimberly   9    8 
14  Brian Tiffany   13   14 
+0

コードの最初の部分を効率的に作成しました。 df =(pd.read_html(" file:/// C:/Python27/babyname999.html ")[0] .rename(columns = ( '無名:0'、1) .set_index( 'ランク'){0 ':'ランク '、' 1 ':'ボーイズ '、' 2 ':'女性 '}) 。) カラムを削除するときに "del"の代わりに "drop"を使用していることに気付きました。私が知っておくべき違いはありますか?私は2番目のパラメータ1が何をしているのか分かりません。 .drop( '名前:0'、1) ありがとう! – Moondra

関連する問題