Это мои данные:

df1 = pd.DataFrame({'sym': ['msft', 'msft', 'amd', 'amd'], 'close': [102, 100, 35, 30]})

df2 = pd.DataFrame({'sym': ['msft', 'amd'], 'close': [103, 36]})

Я хочу объединить df1 и df2 таким образом, чтобы была добавлена первая строка для каждой группы sym в df1. Это упрощенный фрейм данных, в моем оригинале тысячи строк.

Это мой желаемый результат:

 sym  close
0  msft    103
1  msft    102
2  msft    100
3   amd     36
4   amd     35
5   amd     30
3
Amir 30 Июн 2019 в 12:15

4 ответа

Лучший ответ

Вы можете сделать это, используя pd.Categorical() который позволяет вам установить порядок категориального столбца.

m=df2.append(df1,ignore_index=True)
m=m.assign(sym=pd.Categorical(m.sym,df1.sym.unique(),ordered=True)).sort_values('sym')

    sym  close
0  msft    103
2  msft    102
3  msft    100
1   amd     36
4   amd     35
5   amd     30
3
anky_91 30 Июн 2019 в 09:23

Мы можем использовать pd.concat с sort_values по убыванию :

df = pd.concat([df1, df2]).sort_values(['sym', 'close'], 
                                       ascending=False).reset_index(drop=True)

    sym  close
0  msft    103
1  msft    102
2  msft    100
3   amd     36
4   amd     35
5   amd     30

2-й пример

на основе комментария anky_91

df1 = pd.DataFrame({'sym': ['msft', 'msft', 'amd', 'amd','cmd'], 'close': [102, 100, 35, 30,40]})
df2 = pd.DataFrame({'sym': ['msft', 'cmd','amd'], 'close': [103, 23,36]})

    sym  close
0  msft    102
1  msft    100
2   amd     35
3   amd     30
4   cmd     40

    sym  close
0  msft    103
1   cmd     23
2   amd     36

df = pd.concat([df1, df2]).sort_values(['sym', 'close'], 
                                        ascending=False).reset_index(drop=True)

    sym  close
0  msft    103
1  msft    102
2  msft    100
3   cmd     40
4   cmd     23
5   amd     36
6   amd     35
7   amd     30
3
Erfan 30 Июн 2019 в 09:53

Сначала согласовать оба кадра данных
Сортировать по обеим колонкам в порядке убывания

df3 = pd.concat([df1,df2],sort=False)
df3.sort_values(['close', 'sym'], ascending=False,inplace=True)
2
tawab_shakeel 30 Июн 2019 в 09:44

Это должно работать:

import pandas as pd

df1 = pd.DataFrame({'sym': ['msft', 'msft', 'amd', 'amd'], 'close': [102, 100, 35, 30]})
df2 = pd.DataFrame({'sym': ['msft', 'amd'], 'close': [103, 36]})

df3 = df1.append(df2)
df3 = df3.sort_values(['close', 'sym'], ascending=False)

Выход:

    sym close
0   msft    103
0   msft    102
1   msft    100
1   amd 36
2   amd 35
3   amd 30

1
political scientist 30 Июн 2019 в 09:20