【问题标题】:pandas merge and groupby [duplicate]熊猫合并和groupby [重复]
【发布时间】:2018-05-30 01:32:07
【问题描述】:

我有 2 个 Pandas 数据框,如下所示。

数据框 1:

Section    chainage_from     chainage_to     Frame  
R125R002    10.133            10.138          1  
R125R002    10.138            10.143          2  
R125R002    10.143            10.148          3  
R125R002    10.148            10.153          4  
R125R002    10.153            10.158          5

数据框 2:

Section Chainage    1   2   3   4   5   6   7   8   
R125R002    10.133  0   0   1   0   0   0   0   0     
R125R002    10.134  1   0   1   0   0   0   0   0     
R125R002    10.135  0   0   1   0   0   0   0   0     
R125R002    10.136  0   0   1   0   0   0   0   0     
R125R002    10.137  0   0   1   0   0   0   0   0     
R125R002    10.138  0   0   1   0   0   0   0   0     
R125R002    10.139  0   0   1   0   0   0   0   0     
R125R002    10.14   5   0   1   0   0   0   0   0     
R125R002    10.141  1   0   1   0   0   0   0   0     
R125R002    10.142  0   0   1   0   0   0   0   0     
R125R002    10.143  0   0   1   0   0   0   0   0     
R125R002    10.144  0   0   1   0   0   0   0   0     
R125R002    10.145  0   0   1   0   0   0   0   0     
R125R002    10.146  0   0   1   0   0   0   0   0     
R125R002    10.147  0   0   1   0   0   0   0   0     
R125R002    10.148  0   0   1   0   0   0   0   0     
R125R002    10.149  0   0   1   0   0   0   0   0     
R125R002    10.15   0   0   1   0   0   0   0   0     
R125R002    10.151  0   0   1   0   0   0   0   0     
R125R002    10.152  0   0   1   0   0   0   0   0     
R125R002    10.153  0   0   1   0   0   0   0   0  

所需的输出数据框:

Section Chainage Frame  1   2   3   4   5   6   7   8   
R125R002    10.133  1   1   0   1   0   0   0   0   0     
R125R002    10.138  2   0   0   1   0   0   0   0   0     
R125R002    10.143  3   6   0   1   0   0   0   0   0     
R125R002    10.148  4   0   0   1   0   0   0   0   0     
R125R002    10.153  5   0   0   1   0   0   0   0   0   

数据帧 2 的间隔增量为 1 m,而数据帧 1 的增量为 5 m。我想在 chainage_from 和 chainage_to 之间将数据帧 2 合并到数据帧 1 并应用分组依据。第 1 列的 Groupby 是求和,第 2 列最大,第 3 列到第 8 列的平均值。

在 SQL 中,我将链接 2 帧之间的部分,并在从和到的链数条件之间应用,然后添加 groupby。 有什么方法可以在熊猫中实现这一点。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    通过Section 合并数据帧并过滤,使Chainage 在[from & to) 中。

    merged = pd.merge_asof(df2, df1, by='Section', left_on='Chainage', right_on='chainage_from')
    

    groupby 和聚合,传递一个映射列名和聚合函数的字典来使用。

    merged.groupby(['Section', 'chainage_from', 'Frame'], as_index=False).agg(
        {'1': 'sum', '2': 'max', '3': 'mean', '4': 'mean',
         '5': 'mean', '6': 'mean', '7': 'mean', '8': 'mean'}
    )
    

    输出:

        Section  chainage_from  Frame  1  2  3  4  5  6  7  8
    0  R125R002         10.133      1  1  0  1  0  0  0  0  0
    1  R125R002         10.138      2  6  0  1  0  0  0  0  0
    2  R125R002         10.143      3  0  0  1  0  0  0  0  0
    3  R125R002         10.148      4  0  0  1  0  0  0  0  0
    4  R125R002         10.153      5  0  0  1  0  0  0  0  0
    

    【讨论】:

    • 仅供参考,这将创建大型数据框..
    • @Wen,谢谢,我意识到有更好的合并选项,请参阅更新的答案
    • 更好的支持
    【解决方案2】:

    我们可以使用IntervalIndex创建区间,然后使用.loc获取df2值在df1的位置,并分配Frame列,然后我们创建带有列名的dict不同的功能,使用agg来实现你所需要的

    idx = pd.IntervalIndex.from_arrays(left = df1.chainage_from,right = df1.chainage_to,closed = 'left')
    df1.index = idx
    
    df2['Frame'] = df1.loc[df2.Chainage].Frame.values
    
    d = {'Chainage':'first','1':'sum','2':'max'}
    
    d.update(dict(zip(list('345678'),['mean']*6)))
    
    s = df2.groupby(['Section','Frame'],as_index = False).agg(d)
    s
    Out[294]: 
        Section  Frame  6  7  2  1  5  3  8  4  Chainage
    0  R125R002      1  0  0  0  1  0  1  0  0    10.133
    1  R125R002      2  0  0  0  6  0  1  0  0    10.138
    2  R125R002      3  0  0  0  0  0  1  0  0    10.143
    3  R125R002      4  0  0  0  0  0  1  0  0    10.148
    4  R125R002      5  0  0  0  0  0  1  0  0    10.153
    

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 2019-02-24
      • 2020-10-12
      • 2013-06-03
      • 1970-01-01
      • 2014-02-13
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多