2016-09-10 2 views
2

У меня проблемы с алфавитом имен в первом и втором столбцах данных.Сортировка/алфавитный столбец в Dataframes (Pandas)

dataframe выглядит примерно так:

  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' 

Я играл с сортировкой и сортировкой, но столбцы не меняются. У меня нет никого. Какие-либо предложения?

Спасибо!

+0

Вы можете разместить свой желаемый набор данных, потому что не ясно, какие вы пытаетесь достичь? – MaxU

+0

Привет, извините за замешательство. Для колонки Boys я хотел бы сначала увидеть Брайана, а затем продолжить список в алфавитном порядке, заканчивая Robert. Для женщин я хотел бы, чтобы Эми была наверху, а список продолжался в алфавитном порядке. Я бы хотел, чтобы оба мальчика и самки были в алфавитном порядке одновременно. Что касается ранга, я бы хотел, чтобы ранг следовал за именем. Итак, хотя после такого рода, Майкл будет где-то посреди списка, он все равно сохранит Ранг «1». – Moondra

+0

Так что мне нужно было иметь еще один столбец ранга для женского алфавитного варианта, который я только что понял. Это имеет смысл сейчас? Извините за путаницу. – Moondra

ответ

2

Проблема с сортировкой разных столбцов umns блока данных независимо состоит в том, что панды будут просто использовать индекс каждого независимо отсортированного столбца и перестраивать их, тем самым разрушая ваши усилия по сортировке. Вы должны, сортировать и возвращать значения результирующей сортированной серии ... достаточно говорить, пример объяснит гораздо больше.

Предположим, df - ваш пример dataframe. Тогда

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

enter image description here


Чтобы получить что-то близкое к тому, что вы просили

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

Да, это то, что я хочу сделать для колонки Boys and Females одновременно. Я посмотрю ваш код и посмотрю, есть ли у меня какие-либо вопросы. Спасибо. – 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': 'Rank', '1': 'Boys', '2': 'Females'}) .drop ('Без имени: 0', 1) .set_index ('Rank') ) Я заметил, что вы использовали «drop» вместо «del» при удалении столбца. Любую разницу, о которой я должен знать? Я не понимаю, что делает второй параметр 1. .drop ('Без имени: 0', 1) Спасибо! – Moondra

Смежные вопросы