Python 我想从一个数据框中获取一个特定的值,并查看下几行中不同列中的另一个值

Python 我想从一个数据框中获取一个特定的值,并查看下几行中不同列中的另一个值,python,pandas,dataframe,Python,Pandas,Dataframe,我现在有以下数据帧3: size date unix price 0 4.0 2019-11-03 02:42:00 1.570000e+12 9288.5 1 4.0 2019-11-03 02:42:00 1.570000e+12 9288.5 2 4.0 2019-11-03 02:42:00 1.570000e+12 9288.5 3

我现在有以下数据帧3:

           size                date          unix   price
0           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
1           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
2           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
3           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
4           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
...         ...                 ...           ...     ...
1048570    15.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048571  3851.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048572  3793.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048573  1000.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048574   200.0 2019-11-05 05:48:00  1.570000e+12  9331.0
5分钟后,我想看看在一定尺寸下的价格是多少。例如,在尺寸为4的情况下,我想在5分钟后了解价格的价值

我现在有以下代码,获取某些数据时遇到困难:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
%matplotlib inline
headers = ['ticker', 'size', 'price', 'unix','type','date']
dtypes = {'ticker': 'str', 'size': 'float', 'price': 'float', 'unix': 'float','type': 'str','date': 'str'}
parse_dates = ['date']
btcnow = pd.read_csv('new 113-115.csv', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)
now3 = pd.DataFrame(btcnow, columns=['size','date','unix','price'])
x1 = now3.loc[now3["size"] == 24022, "date"]
y1 = now3.loc[now3["size"] == 24022, "size"]
这可以使用unix时间或日期时间来完成。(5分钟是300分钟)

预期输出格式应为5分钟内该大小的价格。例如4号的是2:42我想知道2:47的价格。因此,输出将是2:47的价格。但是,数据中有多个尺寸4,因此它应该在每个尺寸4的旁边输出当前时间和价格以及5分钟内的价格。 想要输出的示例:

size                date             Date +5             Price(in 5)
4           4.0 2019-11-03 02:42:00  2019-11-03 02:42:00  9278.5
4           4.0 2019-11-03 02:49:00  2019-11-03 02:54:00  9288
我尝试了以下方法:

d1= now3.loc[(now3["size"] == 24022) & (now3["date"]+pd.Timedelta('5 minutes')), "price"]

但它在下面的代码中给了我一个错误,它使用timedelta修改原始时间以获得所需的时间,然后将其存储在单独的数据帧中。将所需的(时间、大小)对与所有数据进行内部连接,您将获得所需的数据

from datetime import datetime, timedelta

time_interval = timedelta(minutes = 5)
df = df[[ 'time', 'size', 'price']]

# extract time size for merge
df_time_size= df[['time', 'size']]
df_time_size.loc[:, 'time'] = df_time_size.loc[:, 'time'] + time_interval

# inner join dataframe by size&time
df = df_time_size.merge(df[['time', 'size', 'price']], how = 'inner')
df['orig_time'] = df['time'] - time_interval
输出将类似于:

                   time size  price            orig_time
0   2019-01-01 12:26:00    1      3  2019-01-01 12:21:00
1   2019-01-01 12:27:00    1      1  2019-01-01 12:22:00
编辑:

为了得到最新的价格,我们可以进行分组,然后按时间排序(降序),然后得到第一行

df = df.groupby('size').apply(lambda x: x.sort_values('time', ascending=False).head(1)).reset_index(drop=True)

什么是现在的3,什么是现在的4?这是一个额外的数据帧,我编辑了代码。上面的数据框现在是3。您介意提供预期的输出格式吗?是的,我在上面的输出格式说明中增加了一行。谢谢,但是我怎么能只输出最后一个价格,而不是该尺寸的所有价格呢?@MonicaW您想要每种尺寸一条记录吗?对于最新的价格?还有,我如何才能添加原始价格列?是的,因此不是所有的价格,而是找到当时的最后一个价格。如您的示例所示,对于尺寸1,它将打印$1,因为这是最后一个价格。或者计算平均价格,以可能的为准。两者都是可以实现的。请查看我的最新编辑。