2017-01-29 3 views
2

Пусть у меня есть набор данных фреймовРасчесывание Колонны после Транспонирование Колонны Панды Dataframes

df1 является

ID  C1 
0 0 0.000000 
1 1 0.538516 
2 2 0.509902 
3 3 0.648074 
4 4 0.141421 

df2 является

ID  C1 
0 0 0.538516 
1 1 0.000000 
2 2 0.300000 
3 3 0.331662 
4 4 0.608276 

и DF3 является

ID  C1 
0 0 0.509902 
1 1 0.300000 
2 2 0.000000 
3 3 0.244949 
4 4 0.509902 

Я тогда иду ахей d и транспонировать эти три кадра данных.

df1 = df1.T 
df2 = df2.T 
df3 = df3.T 

Теперь кадры данных:

df1 является

  0   1   2   3   4 
ID  0   1   2   3   4 
C1  0 0.538516 0.509902 0.648074 0.141421 

df2 является:

    0   1 2   3   4 
ID    0   1 2   3   4 
C1    0.538516 0 0.3 0.331662 0.608276 

и DF3 является:

    0 1 2   3   4 
ID    0 1 2   3   4 
C1   0.509902 0.3 0 0.244949 0.509902 

Могу ли я каким-то образом объединить все кадры данных, чтобы иметь

0   1   2   3   4 
0   0.538516 0.509902 0.648074 0.141421 
0.538516  0  0.3  0.331662 0.608276 
0.509902  0.3  0   0.244949 0.509902 

А затем сортировать строки по отдельности, так что каждая строка в результирующем фрейме данных сортируется?

Например фрейм данных с отсортированных строк будет

0 0.141421 0.509902 0.538516 0.648074 
0 0.3  0.331662 0.538516 0.608276 
0 0.244949 0.3  0.509902 0.509902 

У меня возникли проблемы с CONCAT, так как я попутал кадры данных.

Вся помощь ценится

ответ

2

UPDATE: отсортированные набор данных и без транспозиции:

In [64]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index) 
Out[64]: 
    0   1   2   3   4 
0 0.0 0.141421 0.509902 0.538516 0.648074 
1 0.0 0.300000 0.331662 0.538516 0.608276 
2 0.0 0.244949 0.300000 0.509902 0.509902 

Объяснение:

In [67]: d1 
Out[67]: 
    ID  C1 
0 0 0.000000 
1 1 0.538516 
2 2 0.509902 
3 3 0.648074 
4 4 0.141421 

In [68]: d1['C1'].values 
Out[68]: array([ 0.  , 0.538516, 0.509902, 0.648074, 0.141421]) 

In [69]: np.sort(d1['C1'].values) 
Out[69]: array([ 0.  , 0.141421, 0.509902, 0.538516, 0.648074]) 

In [70]: [np.sort(x['C1'].values) for x in dfs] 
Out[70]: 
[array([ 0.  , 0.141421, 0.509902, 0.538516, 0.648074]), 
array([ 0.  , 0.3  , 0.331662, 0.538516, 0.608276]), 
array([ 0.  , 0.244949, 0.3  , 0.509902, 0.509902])] 

теперь мы можем создать DataFrame из списка отсортированных массивов NumPy, указав d1.index в виде столбцов:

In [71]: pd.DataFrame([np.sort(x['C1'].values) for x in dfs], columns=d1.index) 
Out[71]: 
    0   1   2   3   4 
0 0.0 0.141421 0.509902 0.538516 0.648074 
1 0.0 0.300000 0.331662 0.538516 0.608276 
2 0.0 0.244949 0.300000 0.509902 0.509902 
+0

Спасибо за ваш ответ! как бы я мог сортировать каждую строку? Я спрашиваю об этом, так как C1 потерян. Простите, если это тривиальный вопрос, я чрезвычайно новичок в пандах. – Anant

+0

@ У вас будет тот же порядок, что и в списке 'dfs' – MaxU

+0

сортировка невозможна? Я отсортировал свой транспонированный фрейм данных на основе C1. Однако отсортированный порядок был потерян при использовании concat. Я думаю, это потому, что индексы упорядочены вместе по конкатенации. Любой способ обойти это? – Anant

2

Настройка

df1 = pd.DataFrame({ 
     'C1': [0.0, 0.538516, 0.509902, 0.648074, 0.141421], 
     'ID': [0, 1, 2, 3, 4]}) 
df2 = pd.DataFrame({ 
     'C1': [0.538516, 0.0, 0.3, 0.331662, 0.608276], 
     'ID': [0, 1, 2, 3, 4]}) 
df3 = pd.DataFrame({ 
     'C1': [0.509902, 0.3, 0.0, 0.244949, 0.509902], 
     'ID': [0, 1, 2, 3, 4]}) 

Solution (s)

Это выглядит так, как будто ваша ID колонка же важным может быть, что вы хотите присоединиться на. Я бы установил это как ваш индекс, а затем объединил.

Для сортировки каждой строки, я бы оставить в качестве столбцов и применить sort_values

df = pd.concat(
    [d.set_index('ID') for d in [df1, df2, df3]], ignore_index=True, axis=1) 
df.apply(lambda x: x.sort_values().values).T 

ID 0   1   2   3   4 
0 0.0 0.141421 0.509902 0.538516 0.648074 
1 0.0 0.300000 0.331662 0.538516 0.608276 
2 0.0 0.244949 0.300000 0.509902 0.509902 

Получите dataframe и сортировки в numpy

df = pd.concat([d.set_index('ID').T for d in [df1, df2, df3]], ignore_index=True) 

v = df.values 
a = v.argsort(1) 
i = np.arange(a.shape[0])[:, None] 
df.loc[:] = v[i, a] 

df 

ID 0   1   2   3   4 
0 0.0 0.141421 0.509902 0.538516 0.648074 
1 0.0 0.300000 0.331662 0.538516 0.608276 
2 0.0 0.244949 0.300000 0.509902 0.509902 
+0

Спасибо за ваш ответ! как бы я мог сортировать каждую строку? Я спрашиваю об этом, так как C1 потерян. Кроме того, если я сортирую каждую строку при транспозиции, отсортированный порядок теряется после объединения данных. – Anant

+1

@ Этот вопрос не указан в вашем вопросе. Я не понимаю точно, что вам нужно от вашего комментария. Лучше будет следить за другим вопросом. Таким образом, вы можете включить больше информации в отношении того, что вы хотите видеть. – piRSquared

+0

Я добавил детали к вопросу. Благодаря! – Anant

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