将值从一个数据框复制到另一数据框

时间:2019-09-03 22:53:14

标签: python pandas

我有两个熊猫数据帧df1df2df1具有3行3列,而df2具有5行2列。我想像'close'中那样为df2创建一个名为df1的新列。
我想将df1 'close'列元素复制到df2,其中df1日期,索引和时间列与df2日期,索引和时间相同列。

下面,我显示要实现的数据框(df3

time= [datetime.time(10, 7, 59),
       datetime.time(15, 8, 59),
      datetime.time(11, 56, 59)]

date = ['7/2/2019',  '7/3/2019', '7/5/2019']
close = [55,65,75]

Date = ['7/2/2019', '7/2/2019', '7/3/2019', '7/5/2019', '7/5/2019']

Time = [datetime.time(10, 7, 59),
      datetime.time(10, 7, 59),
      datetime.time(15, 8, 59),
      datetime.time(11, 56, 59),
      datetime.time(11, 56, 59)]

Strike = [10000, 10000, 12300, 12200, 12200]


df1 = pd.DataFrame({"Time":time,"close":close},index = date)
df2 = pd.DataFrame({"Time":Time,"strike":Strike},index = Date)

# so i want to achieve df3 below

df3 = pd.DataFrame({"Time":Time,"strike":Strike,"close":[55,55,65,75,75]},index = Date)

1 个答案:

答案 0 :(得分:0)

通过示例数据

由于两个数据框的索引匹配,因此您可以简单地

df2['close'] = df1['close']

pandas将完全满足您的需求。 df2将有一个新列,其外观与您的df3完全一样。由于日期(索引)始终是同一时间,因此无需在此处使用'time'列。

更一般的情况

但是,让我们考虑一下您的日期(索引)相同但时间不同的情况。例如,假设您df2中的时间与您发布的时间略有不同:

Time = [datetime.time(10, 7, 59),
      datetime.time(13, 7, 59),
      datetime.time(15, 8, 59),
      datetime.time(11, 56, 59),
      datetime.time(14, 56, 59)]

在这种情况下,您可以做的是在每个数据框中构建同时考虑日期和时间的新索引(我不知道为什么首先将它们分开)。

鉴于当前的设置,您可以执行以下操作:

ddf1 = df1.set_index(pd.to_datetime(df1.index.to_series() + ' ' + df1['Time'].apply(lambda x : x.strftime('%H:%m:%S'))))
ddf2 = df2.set_index(pd.to_datetime(df2.index.to_series() + ' ' + df2['Time'].apply(lambda x : x.strftime('%H:%m:%S'))))

现在,再次:

ddf2['close'] = ddf1['close']

现在,您将在nan中获得一些ddf2['close']值,因为仅出于精确匹配(日期和时间)而复制值,并且有些时候是不同的。