Как сбросить индекс нескольких столбцов для соответствия двум фреймам данных?

1

У меня есть два DataFrames с именами df и df2 соответственно. Для id столбца df и df2 содержат одинаковые элементы, но порядок элементов различен. Теперь я хочу объединить df и df2 и сохранить порядок id столбца df без изменений.

import pandas as pd 
import numpy as np 
df=pd.DataFrame({'id':['b','c','a','f','e','d']})
df2=pd.DataFrame(np.arange(240).reshape((6,40)),columns=[n for n in range(40)])
df2=pd.concat([df2,pd.DataFrame({'id':['a','b','c','d','e','f']})],axis=1)

Input:

df
   id
0  b
1  c
2  a
3  f
4  e
5  d

df2
      0    1    2    3    4    5    6    7    8    9 ...   31   32   33   34  \
0    0    1    2    3    4    5    6    7    8    9 ...   31   32   33   34
1   40   41   42   43   44   45   46   47   48   49 ...   71   72   73   74
2   80   81   82   83   84   85   86   87   88   89 ...  111  112  113  114
3  120  121  122  123  124  125  126  127  128  129 ...  151  152  153  154
4  160  161  162  163  164  165  166  167  168  169 ...  191  192  193  194
5  200  201  202  203  204  205  206  207  208  209 ...  231  232  233  234

    35   36   37   38   39  id
0   35   36   37   38   39   a
1   75   76   77   78   79   b
2  115  116  117  118  119   c
3  155  156  157  158  159   d
4  195  196  197  198  199   e
5  235  236  237  238  239   f

Expected:

  id    0    1    2    3    4    5    6    7    8 ...    30   31   32   33  \
0  b   40   41   42   43   44   45   46   47   48 ...    70   71   72   73
1  c   80   81   82   83   84   85   86   87   88 ...   110  111  112  113
2  a    0    1    2    3    4    5    6    7    8 ...    30   31   32   33
3  f  200  201  202  203  204  205  206  207  208 ...   230  231  232  233
4  e  160  161  162  163  164  165  166  167  168 ...   190  191  192  193
5  d  120  121  122  123  124  125  126  127  128 ...   150  151  152  153

    34   35   36   37   38   39
0   74   75   76   77   78   79
1  114  115  116  117  118  119
2   34   35   36   37   38   39
3  234  235  236  237  238  239
4  194  195  196  197  198  199
5  154  155  156  157  158  159

My solution:

for col in df2.columns.tolist()[:-1]:
    s = df2.set_index('id')[col]
    val = df['id'].map(s).rename(col)
    dfs.append(val)
temp = pd.concat(dfs, axis=1)
df=pd.concat([df,temp],axis=1)

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

Теги:
pandas
dataframe
performance

1 ответ

1
Лучший ответ

merge с how='left'

df.merge(df2, 'left')

  id    0    1    2    3    4    5    6    7    8 ...    30   31   32   33   34   35   36   37   38   39
0  b   40   41   42   43   44   45   46   47   48 ...    70   71   72   73   74   75   76   77   78   79
1  c   80   81   82   83   84   85   86   87   88 ...   110  111  112  113  114  115  116  117  118  119
2  a    0    1    2    3    4    5    6    7    8 ...    30   31   32   33   34   35   36   37   38   39
3  f  200  201  202  203  204  205  206  207  208 ...   230  231  232  233  234  235  236  237  238  239
4  e  160  161  162  163  164  165  166  167  168 ...   190  191  192  193  194  195  196  197  198  199
5  d  120  121  122  123  124  125  126  127  128 ...   150  151  152  153  154  155  156  157  158  159

Ещё вопросы

Сообщество Overcoder
Наверх
Меню