2014-06-11 4 views
3

Мой dataframe выглядит примерно так, только намного больше.pandas: сортировать каждый столбец индивидуально

d = {'Col_1' : pd.Series(['A', 'B']), 
'Col_2' : pd.Series(['B', 'A', 'C']), 
'Col_3' : pd.Series(['B', 'A']), 
'Col_4' : pd.Series(['C', 'A', 'B', 'D']), 
'Col_5' : pd.Series(['A', 'C']),} 
df = pd.DataFrame(d) 

Col_1 Col_2 Col_3 Col_4 Col_5 
    A  B  B  C  A 
    B  A  A  A  C 
    NaN C  NaN B  NaN 
    NaN NaN NaN D  NaN 

Во-первых, я стараюсь сортировать каждый столбец отдельно. Я пробовал играть с чем-то вроде: df.sort([lambda x: x in df.columns], axis=1, ascending=True, inplace=True), однако, только закончил с ошибками. Как отсортировать каждый столбец индивидуально в конечном итоге что-то вроде:

Col_1 Col_2 Col_3 Col_4 Col_5 
    A  A  A  A  A 
    B  B  B  B  C 
    NaN C  NaN C  NaN 
    NaN NaN NaN D  NaN 

Во-вторых, я ищу для конкатенации строк в столбцах

df = pd.concat([df,pd.DataFrame(df.sum(axis=0),columns=['Concatenation']).T]) 

я могу объединить все с выше после строки заменив np.nan на '', но результат будет разбит («AB») вместе и потребует дополнительного шага для очистки (во что-то вроде «A: B»).

ответ

5

Вот один из способов:

>>> pandas.concat([df[col].order().reset_index(drop=True) for col in df], axis=1, ignore_index=True) 
11:  0 1 2 3 4 
0 A A A A A 
1 B B B B C 
2 NaN C NaN C NaN 
3 NaN NaN NaN D NaN 

[4 rows x 5 columns] 

Однако то, что вы делаете это несколько странно. DataFrames - это не только коллекции несвязанных столбцов. В DataFrame каждая строка представляет собой запись, поэтому значение в одном столбце семантически связано со значениями в других столбцах той же самой строки. Сортируя столбцы независимо, вы отбрасываете эту информацию, поэтому строки теперь бессмысленны. Вот почему в моем примере нужен reset_index. Кроме того, из-за этого, нет никакого способа сделать это на месте, которое ваш пример предлагает вам.

+0

Это немного странно. Каждый столбец представляет собой разговор. Иногда бывает два человека, иногда 3, иногда еще много. Порядок того, кто указан в разговоре, не имеет отношения к делу, так как A: B == B: A. Проблема может быть легко перенесена, но для конечного вывода должна быть горизонтальной. – DataSwede

+0

Вместо того чтобы отбрасывать индекс, я думаю, вы можете/должны просто использовать '.values'. –

0

Я не знаю, если это лучше, но вот несколько других способов сделать это.

pd.DataFrame({key: sorted(value.values(), reverse=True) \ 
    for key, value in df.to_dict().iteritems()}) 

pd.DataFrame({key: sorted(values, reverse=True) \ 
    for key, values in df.transpose().iterrows()}) 
Смежные вопросы