我想找到Vin列的最早日期.通过在列值_1和值_2上应用过滤器1.日期在另一列"日期"中给出

下面是我的数据框.

    import pandas as pd


df_merge= pd.DataFrame({'Vin': ['a123', 'a123', 'a123', 'a123', 'b123', 'b123', 'b123', 'b123'],
                   'Date': ["2022-03-21T15:20:07.536Z", '2022-03-21T15:20:07.510Z', '2022-03-21T15:20:07.535Z',
                            '2022-03-21T15:20:07.535Z','2022-03-22T09:14:59.615Z','2022-03-22T09:14:59.412Z',
                            '2022-03-22T09:14:59.512Z','2022-03-22T09:14:59.615Z'],
                        'Value_1':['1', '0', '1', '1','1', '0', '0', '1'],
                       'Value_2':['1', '1', '1', '0','1', '0', '1', '1']})

我try 了一种方法,通过应用所需的过滤器创建了另一个数据帧,然后使用下面的命令获取最小日期.

Temp_table = pd.DataFrame()
Temp_table = df_merge[(df_merge['Value_1']  == 1) & (df_merge['Value_2']  == 1)]


Temp_table['Result'] = np.where(Temp_table.groupby('Vin')['Date'].transform('min').eq(Temp_table['Date']), 'Yes','No')

在此之后,我将此列与原始数据框合并.这创造了一个我不想要的 Big Data 框架.

下面是我的预期数据框,带有"结果"列:-

df_merge= pd.DataFrame({'Vin': ['a123', 'a123', 'a123', 'a123', 'b123', 'b123', 'b123', 'b123'],
                   'Date': ["2022-03-21T15:20:07.536Z", '2022-03-21T15:20:07.510Z', '2022-03-21T15:20:07.535Z',
                            '2022-03-21T15:20:07.535Z','2022-03-22T09:14:59.615Z','2022-03-22T09:14:59.412Z',
                            '2022-03-22T09:14:59.512Z','2022-03-22T09:14:59.615Z'],
                        'Value_1':['1', '0', '1', '1','1', '0', '0', '1'],
                       'Value_2':['1', '1', '1', '0','1', '0', '1', '1'],
                       'Result':['No', 'No', 'Yes', 'No','Yes', 'No', 'No', 'Yes']})

df_merge

推荐答案

你可以使用:

Update

idx = (df_merge.assign(Date=pd.to_datetime(df_merge['Date']))
               .loc[df_merge['Value_1'].eq('1') & df_merge['Value_2'].eq('1')]
               .groupby('Vin')['Date'].rank(method='min')
               .loc[lambda x: x == 1].index)

df_merge['Result'] = np.where(df_merge.index.isin(idx), 'Yes', 'No')

Old answer

idx = (df_merge.assign(Date=pd.to_datetime(df_merge['Date']))
               .loc[df_merge['Value_1'].eq(1) & df_merge['Value_2'].eq(1)]
               .groupby('Vin')['Date'].idxmin())

df_merge['Result'] = np.where(df_merge.index.isin(idx), 'Yes', 'No')

输出:

>>> idx
Vin
a123    2
b123    7
Name: Date, dtype: int64

>>> df_merge
    Vin                      Date  Value_1  Value_2 Result
0  a123  2022-03-21T15:20:07.536Z        1        1     No
1  a123  2022-03-21T15:20:07.510Z        0        1     No
2  a123  2022-03-21T15:20:07.535Z        1        1    Yes
3  a123  2022-03-21T15:20:07.535Z        1        0     No
4  b123  2022-03-22T09:14:59.616Z        1        1     No
5  b123  2022-03-22T09:14:59.412Z        0        0     No
6  b123  2022-03-22T09:14:59.512Z        0        1     No
7  b123  2022-03-22T09:14:59.615Z        1        1    Yes

注意:如果Date已经是DatetimeIndex,您可以安全地删除assign方法.

Python相关问答推荐

Python 3.12中的通用[T]类方法隐式类型检索

Pystata:从Python并行运行stata实例

运行Python脚本时,用作命令行参数的SON文本

用合并列替换现有列并重命名

如何根据一列的值有条件地 Select 前N组?

Pandas Loc Select 到NaN和值列表

Pandas GroupBy可以分成两个盒子吗?

python中csv. Dictreader. fieldname的类型是什么?'

Pandas—MultiIndex Resample—我不想丢失其他索引的信息´

从嵌套极轴列的列表中删除元素

Python Mercury离线安装

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

当输入是字典时,`pandas. concat`如何工作?

在第一次调用时使用不同行为的re. sub的最佳方式

删除Dataframe中的第一个空白行并重新索引列

Polars定制函数返回多列

一维不匹配两个数组上的广义ufunc

如何在Quarto中的标题页之前创建序言页

当lambda函数作为参数传递时,pyo3执行

将多行数据循环到嵌套框架中的单行