Python, поэлементная сортировка DataFrame - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь отсортировать каждую строку элемента DataFrame.

Ввод:

    A   B   C
0   10  5   6
1   3   6   5
2   1   2   3

Вывод:

    A   B   C
0   10  6   5
1   6   5   3
2   3   2   1

Кажется, это должно быть легко, но я какое-то время терпел неудачу ... Очень новичок в Python.

1 Ответ

1 голос
/ 29 мая 2020

Используйте np.sort с упорядочением подкачки по индексации:

df1 = pd.DataFrame(np.sort(df.to_numpy(), axis=1)[:, ::-1], 
                   index=df.index, 
                   columns=df.columns)
print (df1)
    A  B  C
0  10  6  5
1   6  5  3
2   3  2  1

Pandas решение, более медленное, применяет сортировку для каждой строки отдельно, преобразовывает в массив, а затем в Series:

f = lambda x: pd.Series(x.sort_values(ascending=False).to_numpy(), index=df.columns)
df1 = df.apply(f, axis=1)
print (df1)
    A  B  C
0  10  6  5
1   6  5  3
2   3  2  1

Если возможно, пропущенные значения для меня работают:

print (df)
      A    B    C
0  10.0  6.0  5.0
1   5.0  3.0  NaN
2   2.0  1.0  NaN


df1 = pd.DataFrame(np.sort(df.to_numpy(), axis=1)[:, ::-1], 
                   index=df.index, 
                   columns=df.columns)
print (df1)
      A    B    C
0  10.0  6.0  5.0
1   NaN  5.0  3.0
2   NaN  2.0  1.0

В pandas можно использовать параметр na_position, чтобы указать их порядок:

f = lambda x: pd.Series(x.sort_values(ascending=False, na_position='first').to_numpy(), 
                        index=df.columns)
df1 = df.apply(f, axis=1)
print (df1)
      A    B    C
0  10.0  6.0  5.0
1   NaN  5.0  3.0
2   NaN  2.0  1.0

f = lambda x: pd.Series(x.sort_values(ascending=False, na_position='last').to_numpy(), 
                        index=df.columns)
df1 = df.apply(f, axis=1)
print (df1)
      A    B    C
0  10.0  6.0  5.0
1   5.0  3.0  NaN
2   2.0  1.0  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...