Сортировать данные по другому на один столбец - панды - PullRequest
0 голосов
/ 05 декабря 2018

Допустим, у меня есть данные, как показано ниже:

df=pd.DataFrame({'a':[1,4,3,2],'b':[1,2,3,4]})
df2=pd.DataFrame({'a':[1,2,3,4],'b':[1,2,3,4],'c':[34,56,7,55]})

Я бы хотел отсортировать df данные по порядку df2 данных в столбце 'a', поэтому *Столбец 1007 * будет порядка df2.a и того, что делает весь фрейм данных таким.

Желаемый вывод:

   a  b
0  1  1
1  2  4
2  3  3
3  4  2

(сделано вручную, и если естьошибка с этим, пожалуйста, скажите мне: D)

Моя собственная попытка:

df = df.set_index('a')
df = df.reindex(index=df2['a'])
df = df.reset_index()
print(df)

Работает, как ожидалось !!!,

Но когда у меня более длинные кадры данныхПример:

df=pd.DataFrame({'a':[1,4,3,2,3,4,5,3,5,6],'b':[1,2,3,4,5,5,5,6,6,7]})
df2=pd.DataFrame({'a':[1,2,3,4,3,4,5,6,4,5],'b':[1,2,4,3,4,5,6,7,4,3]})

Это не сработает, как и ожидалось.

Примечание: я не только хочу объяснить, почему, но мне также нужно решение, чтобы сделать это для больших данных-frames

1 Ответ

0 голосов
/ 05 декабря 2018

Одним из возможных решений является создание вспомогательных столбцов в обоих DataFrame с, поскольку дублированные значения:

df['g'] = df.groupby('a').cumcount()
df2['g'] = df2.groupby('a').cumcount()

df = df.set_index(['a','g']).reindex(index=df2.set_index(['a','g']).index)
print(df)
       b
a g     
1 0  1.0
2 0  4.0
3 0  3.0
4 0  2.0
3 1  5.0
4 1  5.0
5 0  5.0
6 0  7.0
4 2  NaN
5 1  6.0

Или, возможно, потребуется merge:

df3 = df.merge(df2[['a','g']], on=['a','g'])
print(df3)
   a  b  g
0  1  1  0
1  4  2  0
2  3  3  0
3  2  4  0
4  3  5  1
5  4  5  1
6  5  5  0
7  5  6  1
8  6  7  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...