Python 使用idxmax和idxmin更改不同行中的值

Python 使用idxmax和idxmin更改不同行中的值,python,pandas,time-series,.loc,Python,Pandas,Time Series,.loc,我正在尝试找到最干净、最泛化的方法来创建一个新列,该列具有同一行中一列的最小值和另一列中的最大值。其余的值可以是nan,因为我将进行插值 rng = pd.date_range(start=datetime.date(2020,8,1), end=datetime.date(2020,8,3), freq='H') df = pd.DataFrame(rng, columns=['date']) df.index=pd.to_datetime(df['date']) df.drop(['date

我正在尝试找到最干净、最泛化的方法来创建一个新列,该列具有同一行中一列的最小值和另一列中的最大值。其余的值可以是nan,因为我将进行插值

rng = pd.date_range(start=datetime.date(2020,8,1), end=datetime.date(2020,8,3), freq='H')
df = pd.DataFrame(rng, columns=['date'])
df.index=pd.to_datetime(df['date'])
df.drop(['date'],axis=1,inplace=True)
df['val0']=np.random.randint(0,50,49)
df['val1']=np.random.randint(0,50,49)
df(复制剪切粘贴)的一种实现:

现在,我找到了的idxmax和idxmin:

minidx=df.groupby(pd.Grouper(freq='D')).idxmin()
maxidx=df.groupby(pd.Grouper(freq='D')).idxmax()
minidx:

                          val0                val1
date                                              
2020-08-01 2020-08-01 23:00:00 2020-08-01 01:00:00
2020-08-02 2020-08-02 06:00:00 2020-08-02 10:00:00
2020-08-03 2020-08-03 00:00:00 2020-08-03 00:00:00
maxidx:

                          val0                val1
date                                              
2020-08-01 2020-08-01 09:00:00 2020-08-01 21:00:00
2020-08-02 2020-08-02 21:00:00 2020-08-02 18:00:00
2020-08-03 2020-08-03 00:00:00 2020-08-03 00:00:00
在这种情况下,我希望将位于2020-08-01 23:00:00的最小日值(7)放入2020-08-01 21:00:00的新列中(即与89相邻,日最大值1),并对所有其他日期执行相同操作,以便2020-08-02 18:00:00的“新”值将为1(即2020-08-02 06:00:00发生的最小日值)

我尝试了以下方法,但我只得到了一堆NaN:

df.loc[maxidx['val1'].values,'new']=df.loc[minidx['val0'].values,'val0']
如果我只是将其设置为int(
df.loc[maxidx['val1'].values,'new']=6
),我会在需要新值的地方得到int。我想要的值由
df.loc[minidx['val0'].values,'val0']
给出,但我似乎无法将它们放入数据帧

minidx['val0'].值
maxidx['val1'].值
是与numpy.datetime64类型元素大小相同的数组,它们都是从相同的数据帧生成的,因此maxidx和minidx应该存在于df.index(
df.index.values
)中


有没有一个明显的原因,这是不工作的?谢谢

我找到的最简单的解决方案是通过idxmin和idxmax进行循环:

for v0,v1 in zip(minidx['val0'].values,maxidx['val1'].values):
    df.loc[v1,'new']=df.loc[v0,'val0']

这给了我想要的东西,但似乎不是很随意,所以任何其他实现同样的事情的建议都是很好的。

我找到的最简单的解决方案是循环使用idxmin和idxmax:

for v0,v1 in zip(minidx['val0'].values,maxidx['val1'].values):
    df.loc[v1,'new']=df.loc[v0,'val0']

这给了我我想要的,但似乎不是很夸张,所以任何其他实现同样目标的建议都会很好。

IIUC,您可以使用:

输出:

                 val0_min_time  val0_min_value       val0_max_time  val0_max_value       val1_min_time  val1_min_value       val1_max_time  val1_max_value
date                                                                                                                                                      
2020-08-01 2020-08-01 23:00:00               7 2020-08-01 09:00:00              95 2020-08-01 01:00:00               0 2020-08-01 21:00:00              89
2020-08-02 2020-08-02 06:00:00               1 2020-08-02 21:00:00              96 2020-08-02 10:00:00               0 2020-08-02 18:00:00              96
2020-08-03 2020-08-03 00:00:00              26 2020-08-03 00:00:00              26 2020-08-03 00:00:00              47 2020-08-03 00:00:00              47

IIUC,您可以使用:

输出:

                 val0_min_time  val0_min_value       val0_max_time  val0_max_value       val1_min_time  val1_min_value       val1_max_time  val1_max_value
date                                                                                                                                                      
2020-08-01 2020-08-01 23:00:00               7 2020-08-01 09:00:00              95 2020-08-01 01:00:00               0 2020-08-01 21:00:00              89
2020-08-02 2020-08-02 06:00:00               1 2020-08-02 21:00:00              96 2020-08-02 10:00:00               0 2020-08-02 18:00:00              96
2020-08-03 2020-08-03 00:00:00              26 2020-08-03 00:00:00              26 2020-08-03 00:00:00              47 2020-08-03 00:00:00              47

IIUC您可以直接使用
df.groupby(pd.Grouper(freq=“D”)).agg({val0:“min”,“val1:“max”})
?据我所见,这会给出值,但不会给出索引。我需要的是索引,这样我就可以将“new”的值直接分配给适当的行(即最大值1的“date_time”)。IIUC您可以使用
df.groupby(pd.Grouper(freq=“D”)).agg({“val0”:“min”,“val1”:“max”})
,从我的角度来看,这给了我值,但不是索引。我需要的是索引,以便我可以将“new”的值分配给适当的行(即最大值为1的“date\u time”)。