在熊猫数据框中为每个组添加第一行

时间:2019-06-30 09:15:40

标签: python pandas

这些是我的数据框:

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

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

我想结合df1df2的方式是为sym中的每一组df1添加第一行。这是一个简化的数据框,我原来有数千行。

这是我想要的结果:

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

4 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:3)

我们可以将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

第二个示例

基于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

答案 2 :(得分:2)

首先连接两个数据框
按两列的降序排列

df3 = pd.concat([df1,df2],sort=False)
df3.sort_values(['close', 'sym'], ascending=False,inplace=True)

答案 3 :(得分:1)

这应该有效:

$.wait(a()).done(
    function(){ 
        console.log("function a() and b() done");
    }
);

输出:

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)