【问题标题】:Combine two pandas DataFrame into one new将两个 pandas DataFrame 合并为一个新的
【发布时间】:2017-08-30 21:16:23
【问题描述】:

我有两个 Pandas DataFrame,它们的数据来自不同的来源,但两个 DataFrame 的列名相同。合并时只有一列会保留名称。

像这样:

speed_df = pd.DataFrame.from_dict({
    'ts':  [0,1,3,4],
    'val': [5,4,2,1]
    })

temp_df = pd.DataFrame.from_dict({
    'ts':  [0,1,2],
    'val': [9,8,7]
    })

我需要这样的结果:

final_df = pd.DataFrame.from_dict({
    'ts':    [0,1,2,3,4],
    'speed': [5,4,NaN,1],
    'temp':  [9,8,7,NaN,NaN]
    })

稍后我将通过复制前一个有效值的值来处理空单元格(这里用 NaN 填充)。得到这样的东西:

final_df = pd.DataFrame.from_dict({
    'ts':    [0,1,2,3,4],
    'speed': [5,4,4,1],
    'temp':  [9,8,7,7,7]
    })

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用pd.merge

    In [406]: (pd.merge(speed_df, temp_df, how='outer', on='ts')
                 .rename(columns={'val_x': 'speed','val_y': 'temp'})
                 .sort_values(by='ts'))
    Out[406]:
       ts  speed  temp
    0   0    5.0   9.0
    1   1    4.0   8.0
    4   2    NaN   7.0
    2   3    2.0   NaN
    3   4    1.0   NaN
    
    In [407]: (pd.merge(speed_df, temp_df, how='outer', on='ts')
                 .rename(columns={'val_x': 'speed', 'val_y': 'temp'})
                 .sort_values(by='ts').ffill())
    Out[407]:
       ts  speed  temp
    0   0    5.0   9.0
    1   1    4.0   8.0
    4   2    4.0   7.0
    2   3    2.0   7.0
    3   4    1.0   7.0
    

    【讨论】:

    • 谢谢!这正是需要的。
    【解决方案2】:

    两个主要的DataFrame选项,一个是pd.merge,另一个是pd.fillna。代码如下:

    df = speed_df.merge(temp_df, how='outer', on='ts')
    df = df.rename(columns=dict(val_x='speed', val_y='temp'))
    df = df.sort_values('ts')
    df.fillna(method='ffill')
    

    希望这会有所帮助。

    谢谢

    【讨论】:

    • 这一步一步与@JohnGalt 的答案相同
    【解决方案3】:

    您需要使用 pandas.merge 函数进行左外连接

    d = pd.merge(speed_df,temp_df,on='ts',how='outer').rename(columns=\
    {'val_x':'speed','val_y':'temp'})
    d = d.sort_values('ts')
    d['speed']=d['speed'].fillna(4)
    d['temp']=d['temp'].fillna(7)
    

    这应该返回给你:

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多