比较同一数据帧的两列并返回同一数据帧的不同列

时间:2021-04-14 02:06:35

标签: python pandas dataframe

无法从列(周)中提取单个值,但单个值有效。

u = eurusd.loc[eurusd['Local time'] == pd.to_datetime("2014-01-08 03:00:00",format="%Y-%m-%d %H:%M:%S")].Close
print(u)

输出:

70275    1.36075
Name: Close, dtype: float64

但是当我尝试这个时:

u = eurusd.loc[eurusd['Local time'] == pd.to_datetime(eurusd['Week'],format="%Y-%m-%d %H:%M:%S")].Close
print(u)

输出:

Series([], Name: Close, dtype: float64)

我也尝试用apply方法做同样的任务,但它似乎只是逐行比较列,而不是迭代的

eurusd['ResultClose'] = eurusd.apply(lambda eurusd: eurusd if eurusd['Local time'] == "2014-01-08 03:00:00" else np.nan,axis=1)

要仔细检查代码:

eurusd.isnull().sum()

输出(显示列中没有插入值):

Local time        0
Close             0
ResultClose       8760
dtype: int64

下表给出了我试图实现的目标。

初始表

<头>
当地时间 关闭
2014-01-01 00:00:00 1.37410 2014-01-08 00:00:00
2014-01-01 01:00:00 1.37410 2014-01-08 01:00:00
2014-01-01 02:00:00 1.37410 2014-01-08 02:00:0
2014-01-08 03:00:00 1.36075 2014-03-08 02:00:0

决赛桌

<头>
当地时间 关闭 结果关闭
2014-01-01 00:00:00 1.37410 2014-01-08 00:00:00 1.36075
2014-01-01 01:00:00 1.37410 2014-01-08 01:00:00 .
2014-01-01 02:00:00 1.37410 2014-01-08 02:00:00 .
2014-01-08 03:00:00 1.36075 2014-03-08 02:00:0 .

1 个答案:

答案 0 :(得分:1)

首先使用 to_datetime() 方法将 'Local time''Week' 转换为 datetime dtype:

eurusd['Local time']=pd.to_datetime(eurusd['Local time'])
eurusd['Week']=pd.to_datetime(eurusd['Week'])

现在使用布尔掩码和 between() 方法:

mask=eurusd['Local time'].between(eurusd.loc[0,'Week'],eurusd.loc[len(eurusd)-1,'Week'])
value=eurusd.loc[mask,'Close'].reset_index(drop=True)

最后使用assign()方法:

eurusd=eurusd.assign(ResultClose=value)

现在,如果您打印 eurusd,您将获得所需的输出:

        Local time          Close           Week               ResultClose
0   2014-01-01 00:00:00     1.37410     2014-01-08 00:00:00     1.36075
1   2014-01-01 01:00:00     1.37410     2014-01-08 01:00:00     NaN
2   2014-01-01 02:00:00     1.37410     2014-01-08 02:00:00     NaN
3   2014-01-08 03:00:00     1.36075     2014-03-08 02:00:00     NaN