我正在判断两个值之间的差值是否为0.5,AND如果它们发生在不同的日期,则这是一个标志.

样本数据:

df = pd.DataFrame({'date1' : ['2023-05-11', '2023-02-24', '2023-07-9', '2023-01-19', '2023-02-10'],
                  'date2' : ['2023-05-11', '2023-02-24', '2023-07-8', '2023-01-17', '2023-02-10'],
                  'value1' : [9.11, .12, 49.1, 2.25, 6.22],
                  'value2' : [2.12, .86, 0.03, .17, 4.71]})

df
    date1       date2       value1  value2
0   2023-05-11  2023-05-11  9.11    2.12
1   2023-02-24  2023-02-24  0.12    0.86
2   2023-07-09  2023-07-08  49.1    0.03
3   2023-01-19  2023-01-17  2.25    0.17
4   2023-02-10  2023-02-10  6.22    4.71

df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])

当我try 使用apply函数时:

df.apply(lambda x : 'yes' if (abs(x['value1'] - x['value2']) > .5) & (x['date1'].date != x['date2'].date) else 'no', axis = 1)

0    yes
1    yes
2    yes
3    yes
4    yes
dtype: object

如果没有apply功能:

(abs(df['value1'] - df['value2']) > .5) & (df['date1'].dt.date != df['date2'].dt.date)

0    False
1    False
2     True
3     True
4    False
dtype: bool

正如我们在上面看到的,没有apply函数的直接方法给出的是预期的输出,而应用函数不是.你能告诉我为什么会这样吗?

推荐答案

对于日期的相同输出dd (),因为使用Timestamp.date而不是Series.dt.date:

#if omit () get built methods
print (df.apply(lambda x : x['date1'].date, axis = 1))
 0    <built-in method date of Timestamp object at 0...
 1    <built-in method date of Timestamp object at 0...
 2    <built-in method date of Timestamp object at 0...
 3    <built-in method date of Timestamp object at 0...
 4    <built-in method date of Timestamp object at 0...
 dtype: object

#get dates
print (df.apply(lambda x : x['date1'].date(), axis = 1))
0    2023-05-11
1    2023-02-24
2    2023-07-09
3    2023-01-19
4    2023-02-10
dtype: object

df.apply(lambda x : (abs(x['value1'] - x['value2']) > .5) &
                    (x['date1'].date() != x['date2'].date()), axis = 1)

更好的方法是您的第二种矢量化方法:

(abs(df['value1'] - df['value2']) > .5) & (df['date1'].dt.date != df['date2'].dt.date)

如果需要返回yes/no:

np.where((abs(df['value1'] - df['value2']) > .5) & (df['date1'].dt.date != df['date2'].dt.date), 'yes', 'no')

df.apply(lambda x : 'yes' if (abs(x['value1'] - x['value2']) > .5) & (x['date1'].date() != x['date2'].date()) else 'no', axis = 1)

编辑:如果使用Boolean,&and工作相同,感谢@Mustafa Aydın的 comments :

在布尔AND运算中使用and比使用&更清楚,因为&主要用于按位运算--在纯Python中,重载用于矢量化--以及在NumPy(和Pandas)中

print (True and True)
True
print (False and True)
False
print (True and False)
False
print (False and False)False

print (True & True)
True
print (False & True)
False
print (True & False)
False
print (False & False)
False

Python相关问答推荐

KNN分类器中的GridSearchCV

使用regex分析具有特定字符的字符串(如果它们存在)

Pandas :多索引组

多处理代码在while循环中不工作

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

Django mysql图标不适用于小 case

'discord.ext. commanders.cog没有属性监听器'

什么相当于pytorch中的numpy累积ufunc

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

如何使用它?

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

Odoo 16使用NTFS使字段只读

根据列值添加时区

Python中的变量每次增加超过1

CommandeError:模块numba没有属性generated_jit''''

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

语法错误:文档. evaluate:表达式不是合法表达式

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

如何在信号的FFT中获得正确的频率幅值