我有两个熊猫数据帧df1
和df2
。 df1
具有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)
答案 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']
值,因为仅出于精确匹配(日期和时间)而复制值,并且有些时候是不同的。