У меня есть два Pandas DataFrames, чьи данные из разных источников, но оба DataFrames имеют одинаковые имена столбцов. При объединении только один столбец будет содержать имя.

Нравится:

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]
    })
0
ulitosCoder 31 Авг 2017 в 00:16

3 ответа

Лучший ответ

Используйте 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
5
Zero 30 Авг 2017 в 21:22

Два основных параметра 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')

Надеюсь, это будет полезно.

Спасибо

0
rojeeer 30 Авг 2017 в 21:27

Вам нужно сделать левое внешнее соединение, используя функцию 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)

Это должно вернуть вам это:

enter image description here

-1
ashish trehan 30 Авг 2017 в 21:50