如何使用lambda函数从两个python数据框中选择较大的值,同时按日期进行比较?

问题描述 投票:0回答:1

我想把df1的行和df2的值按月和日进行映射比较,在df2的每一年中,只留下df1中的值比df2中的值大,并添加到一个新的列 "New "中。df1和df2大小相同,并以 "月 "和 "日 "为索引。

df1=pd.DataFrame({'Date':['2015-01-01','2015-01-02','2015-01-03','2015-01-``04','2005-01-05'],'Values':[-5.6,-5.6,0,3.9,9.4]})

df1.Date=pd.to_datetime(df1.Date)df1['Day']=pd.DatetimeIndex(df1['Date']).daydf1['Month']=pd.DatetimeIndex(df1['Date']).monthdf1.set_index(['Month','Day'],inplace=True) df1

df2 = pd.DataFrame({'Date':['2005-01-01','2005-01-02','2005-01-03','2005-01-``04','2005-01-05'],'Values':[-13.3,-12.2,6.7,8.8,15.5]})

df2.Date=pd.to_datetime(df1.Date)df2['Day']=pd.DatetimeIndex(df2['Date']).daydf2['Month']=pd.DatetimeIndex(df2['Date']).monthdf2.set_index(['Month','Day'],inplace=True)df2

df1 和 df2 的大小相同,并且以 "月 "和 "日 "为索引。

df2['New']=df2[df2['Values']<df1['Values']]

给予ValueError: Can only compare identically-labeled Series objects

我也试过df2['New']=df2[df2['Values'].apply(lambda x: x < df1['Values'].values)]

python-3.x pandas dataframe apply python-datetime
1个回答
0
投票

处理你的问题最好的方法是使用numpy这个工具。Numpy有一个叫做 "where "的属性,在这样的情况下,它可以帮助你解决很多问题。

这句话是如何工作的。

df1['new column that will contain the comparison results'] = np.where(condition,'value if true','value if false').

首先导入库

import numpy as np

使用你提供的条件

df2['New'] = np.where(df2['Values'] > df1['Values'], df2['Values'],'')

所以,我认为这解决了你的问题... ... 你可以把传给False条件的值改成你想要的任何值,这只是一个例子。

告诉我们是否有效


0
投票

让我们试试两种可能的解决方案。

第一个解决方案是先对索引进行排序。

df1.sort_index(inplace=True)
df2.sort_index(inplace=True)

执行一个简单的测试来看看它是否有效!

df1 == df2

有可能出现某种错误,所以如果发生这种情况,请尝试这种修正。

df1.sort_index(inplace=True, axis=1)
df2.sort_index(inplace=True, axis=1)

第二种解决方案是放弃索引并重新设置。

df1.sort_index(inplace=True)
df2.sort_index(inplace=True)

进行一个简单的测试,看看是否有效!

df1 == df2

看看是否有效,并告诉我们结果。

© www.soinside.com 2019 - 2024. All rights reserved.