Python 修改函数以返回具有指定值的数据帧
参考下面的测试数据和我用来识别彼此变量Python 修改函数以返回具有指定值的数据帧,python,pandas,Python,Pandas,参考下面的测试数据和我用来识别彼此变量thresh中的值的函数 有人能帮我修改一下以显示我所显示的预期输出吗 测试数据 import pandas as pd import numpy as np from itertools import combinations df2 = pd.DataFrame( {'AAA' : [4,5,6,7,9,10], 'BBB' : [10,20,30,40,11,10], 'CCC' : [100,50,25
thresh
中的值的函数
有人能帮我修改一下以显示我所显示的预期输出吗
测试数据
import pandas as pd
import numpy as np
from itertools import combinations
df2 = pd.DataFrame(
{'AAA' : [4,5,6,7,9,10],
'BBB' : [10,20,30,40,11,10],
'CCC' : [100,50,25,10,10,11],
'DDD' : [98,50,25,10,10,11],
'EEE' : [103,50,25,10,10,11]});
功能:
thresh = 5
def closeCols2(df):
max_value = None
for k1,k2 in combinations(df.keys(),2):
if abs(df[k1] - df[k2]) < thresh:
if max_value is None:
max_value = max(df[k1],df[k2])
else:
max_value = max(max_value, max(df[k1],df[k2]))
return max_value
应用后的当前系列输出:
AAA BBB CCC DDD EEE
0 4 10 100 98 103
1 5 20 50 50 50
2 6 30 25 25 25
3 7 40 10 10 10
4 9 11 10 10 10
5 10 10 11 11 11
df2.apply(closeCols2, axis=1)
0 103
1 50
2 25
3 10
4 11
5 11
dtype: int64
所需输出是一个数据框,显示thresh
内的所有值,以及nan
中不在thresh内的任何值
AAA BBB CCC DDD EEE
0 nan nan 100 98 103
1 nan nan 50 50 50
2 nan 30 25 25 25
3 7 nan 10 10 10
4 9 11 10 10 10
5 10 10 11 11 11
使用轴=1的
mask
和sub
df2.mask(df2.sub(df2.apply(closeCols2, 1), 0).abs() > thresh)
AAA BBB CCC DDD EEE
0 NaN NaN 100 98 103
1 NaN NaN 50 50 50
2 NaN 30.0 25 25 25
3 7.0 NaN 10 10 10
4 9.0 11.0 10 10 10
5 10.0 10.0 11 11 11
注意:
我重新定义了
closeCols
,将thresh
作为一个参数。然后您可以在apply
调用中传递它
def closeCols2(df, thresh):
max_value = None
for k1,k2 in combinations(df.keys(),2):
if abs(df[k1] - df[k2]) < thresh:
if max_value is None:
max_value = max(df[k1],df[k2])
else:
max_value = max(max_value, max(df[k1],df[k2]))
return max_value
df2.apply(closeCols2, 1, thresh=5)
当我看到这样的答案时,我意识到我有很多东西要学。。。非常感谢@阿黛尔,我已经更新了我的答案。你可能会发现新的信息很有用。然而,这可能也很难理解。再次感谢这是伟大的!我也在看你的“路径依赖切片”代码。在我花太多时间试图了解您所做的工作之前,您认为它对利润目标分析财务数据可能有用吗?i、 e.是否可以用它来判断一个简单的交易策略是否首先达到了止损或利润目标?简短回答。。。对很好地创建了一个新的轴和广播,以获得所有的组合。
v = df2.values
df2.mask((np.abs(v[:, :, None] - v[:, None]) <= 5).sum(-1) <= 1)
AAA BBB CCC DDD EEE
0 NaN NaN 100 98 103
1 NaN NaN 50 50 50
2 NaN 30.0 25 25 25
3 7.0 NaN 10 10 10
4 9.0 11.0 10 10 10
5 10.0 10.0 11 11 11