我想把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']).day
df1['Month']=pd.DatetimeIndex(df1['Date']).month
df1.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']).day
df2['Month']=pd.DatetimeIndex(df2['Date']).month
df2.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)]
处理你的问题最好的方法是使用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条件的值改成你想要的任何值,这只是一个例子。
告诉我们是否有效
让我们试试两种可能的解决方案。
第一个解决方案是先对索引进行排序。
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
看看是否有效,并告诉我们结果。