将带有关键字“时间”的两列合并为“必须对正确的关键字进行排序”并分配ID

时间:2019-04-07 05:26:23

标签: pandas csv dataframe merge

基于我之前的问题

Join two dataframe and expand the dataframe with assign the ID

我有两个像这样的数据框:

 df1
 ID         Time
 ID_E   9:07:00
 ID_E   9:15:00
 ID_B   9:09:00
 ID_B   9:14:00

 df2 
 Time        X        Y
 9:07:00    767597  9427273
 9:08:00    767597  9427284
 9:09:00    767608  9427284
 9:10:00    767608  9427295
 9:11:00    767619  9427306
 9:12:00    767623  9427311
 9:13:00    767628  9427319
 9:14:00    767634  9427327
 9:15:00    767640  9427335

我想将一个数据帧插入另一个具有ID为“ Time”的时间键的数据帧。但是,结果出现错误right keys must be sorted,这是因为df1中的时间未排序。如何解决这种情况?

我使用了以下代码:

df1 = pd.read_csv(data1.csv)
df1.columns = df1.columns.str.strip()
df2 = pd.read_csv(data2.csv)
df2.columns = df2.columns.str.strip()
df1['Time'] = pd.to_datetime(df1['Time'])
df2['Time'] = pd.to_datetime(df2['Time'])
df = pd.merge_asof(df2, df1, on='Time').assign(Time = lambda x: x['Time'].dt.strftime('%H:%M'))
df

我的预期结果:

  ID    Time         X        Y
  ID_E  9:07:00 767597  9427273
  ID_E  9:08:00 767597  9427284
  ID_E  9:09:00 767608  9427284
  ID_E  9:10:00 767608  9427295
  ID_E  9:11:00 767619  9427306
  ID_E  9:12:00 767623  9427311
  ID_E  9:13:00 767628  9427319
  ID_E  9:14:00 767634  9427327
  ID_E  9:15:00 767640  9427335
  ID_B  9:09:00 767608  9427284
  ID_B  9:10:00 767608  9427295
  ID_B  9:11:00 767619  9427306
  ID_B  9:12:00 767623  9427311
  ID_B  9:13:00 767628  9427319
  ID_B  9:14:00 767634  9427327

谢谢你对我的帮助。

1 个答案:

答案 0 :(得分:1)

您得到:

  

右键必须排序

这是右键列表df1.Time,因此有必要在merge_asof之前按此列排序:

df1 = df1.sort_values('Time')

如果错误也需要按df2.Time进行排序:

  

左键必须排序

df2 = df2.sort_values('Time')

一起:

df1 = pd.read_csv(data1.csv)
df1.columns = df1.columns.str.strip()
df2 = pd.read_csv(data2.csv)
df2.columns = df2.columns.str.strip()
df1['Time'] = pd.to_datetime(df1['Time'])
df2['Time'] = pd.to_datetime(df2['Time'])
df1 = df1.sort_values('Time')

df = pd.merge_asof(df2, df1, on='Time').assign(Time = lambda x: x['Time'].dt.strftime('%H:%M'))