【问题标题】:python: row concat 2 dataframes, keeping their names as a new columnpython:行 concat 2 数据帧,将它们的名称保留为新列
【发布时间】:2019-03-08 15:41:21
【问题描述】:

我正在寻找与bind_rows(R 中的 dplyr 包)等效的 Pythonic 方式,它从 data.frames 列表中连接数据帧并自动添加每个 data.frame 的名称作为 .id 列来记住行的来源。

有没有简单的方法来做到这一点?我尝试使用pd.concat

df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number'])
df2 = df1.copy()
pd.concat([df1, df2])

预期输出:

####     .id letter  number
#### 0   df1      a       1
#### 1   df1      b       2
#### 0   df2      a       1
#### 1   df2      b       2

谢谢!

【问题讨论】:

    标签: python r pandas rbind


    【解决方案1】:

    检查keys

    pd.concat([df1, df2], keys=['df1', 'df2'],names =['id','index']).reset_index(level=0)
    Out[880]: 
            id letter  number
    index                    
    0      df1      a       1
    1      df1      b       2
    0      df2      a       1
    1      df2      b       2
    

    如果你想动态创建键

    pd.concat({x : y for x,y in enumerate([df1, df2])},names =['id','index']).reset_index(level=0)
    Out[879]: 
           id letter  number
    index                   
    0       0      a       1
    1       0      b       2
    0       1      a       1
    1       1      b       2
    

    【讨论】:

    • 好的,谢谢,我刚刚检查了文档中的这个关键参数,对我来说不是很清楚,你是为了它的副作用而使用它还是它是参数的实际目的?
    • @agenis 只是在此处添加它们来自的数据的 id,这更像是一种副作用
    【解决方案2】:
    pd.concat([df1, df2],keys=['df1','df2']).reset_index(level=0).rename(columns = {'level_0':'.id'})
    
        id  letter  number
    0   df1 a   1
    1   df1 b   2
    0   df2 a   1
    1   df2 b   2
    
    

    【讨论】:

    • 看起来和我的回答一样。
    • 是的。我刚才看到了。我阅读了问题并发布了答案。无论如何,正如你之前发布的那样,我支持你的投票
    • 相同的功能,感谢末尾与我的列名匹配的“重命名”提示
    猜你喜欢
    • 2015-09-17
    • 2020-03-15
    • 2020-01-22
    • 2013-12-23
    • 2015-12-08
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多