如何运行lambda函数在pandas中运行多准则排序?

2024-09-29 02:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的df和更多的日期。你知道吗

df = {'Date': ('10/6/2015', '10/7/2015'),
         'CAD 12M PR': (-7.4, -4.9),
         'AUD 12M PR': (-2.3, -1.6),
         'NOK 12M PR': (2.6, 8.6),
         'SEK 12M PR': (6.7, 8.6),
         'NZD 12M PR': (3.1, 2.9),
         'EUR 12M PR': (2.7, 4.7),
         'GBP 12M PR': (-3.6, -2.5),
         'JPY 12M PR': (13.8, 15.7),
         'CAD 1Y ZS': (3.1, 2.5),
         'AUD 1Y ZS': (-1.7, -3.0),
         'NOK 1Y ZS': (2.0, 1.8),
         'SEK 1Y ZS': (2.6, 2.6),
         'NZD 1Y ZS': (-4.5, -5.6),
         'EUR 1Y ZS': (-3.8, -3.7),
         'GBP 1Y ZS': (-1.6, -2.7),
          'JPY 1Y ZS': (3.0, 2.1)
         }

在df中有8种货币(加元、澳元、挪威克朗、瑞典克朗、新西兰元、欧元、英镑、日元)和2个不同的数据点:1200万PR(12个月价格回报)和1年ZS(1年z分数)。我想创建一个新的投资组合(列表)与前2个买入/卖出从这个数据框。对于第一类,我想将1200万欧元从大到小排列,将排名前4位的1200万欧元货币放入“买入区间”,将排名后4位的1200万欧元货币放入“卖出区间”。第二类是基于1Y Z。对于买入,我想要最高1Y Z的2种货币(来自排名前4位的12M PR桶),对于卖出,我想要最低1Y Z的2种货币(来自排名后4位的12M PR桶)。你知道吗

2015年6月10日,按1200万欧元计算,排名前4位的货币是日元、瑞典克朗、新西兰元和欧元。从这个角度来看,日元和瑞典克朗的1Y Z最高,因此它们是买入的货币。按1200万欧元计算,排名倒数第四的货币是加元、英镑、澳元和挪威克朗。从这一区间来看,澳元和英镑的1Y Z最低,因此它们是卖出价。你知道吗

为了在所有货币中获得最大的1200万美元的公共关系,我尝试了:

df.apply(lambda row: row.nlargest(1).values[-1] in [['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR', 'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']], axis=1)

为了在所有货币中获得最小的1200万美元的公共关系,我试着:

df.apply(lambda row: row.nsmallest(1).values[-1] in [['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR', 'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']], axis=1)

对于这两种情况,我都有一个错误:

TypeError: ("Cannot use method 'nlargest' with dtype object", 'occurred at index 0')

我的计划是使用上述代码将1200万PR分类到买入/卖出桶中,然后做同样的事情在1Y Z中找到第一/第二大/最小的-


Tags: df货币preurrowgbpcad区间
1条回答
网友
1楼 · 发布于 2024-09-29 02:22:23

您应该在原始数据帧上尝试df.apply(lambda x: x.dtype)。您将看到,所有数据都转换为object,因为存在混合类型(日期是对象)。你知道吗

例如:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2 entries, 0 to 1
Data columns (total 17 columns):
Date          2 non-null object
CAD 12M PR    2 non-null float64
AUD 12M PR    2 non-null float64
NOK 12M PR    2 non-null float64
SEK 12M PR    2 non-null float64
NZD 12M PR    2 non-null float64
EUR 12M PR    2 non-null float64
GBP 12M PR    2 non-null float64
JPY 12M PR    2 non-null float64
CAD 1Y ZS     2 non-null float64
AUD 1Y ZS     2 non-null float64
NOK 1Y ZS     2 non-null float64
SEK 1Y ZS     2 non-null float64
NZD 1Y ZS     2 non-null float64
EUR 1Y ZS     2 non-null float64
GBP 1Y ZS     2 non-null float64
JPY 1Y ZS     2 non-null float64
dtypes: float64(16), object(1)
memory usage: 352.0+ bytes

当您在应用程序中尝试这些混合类型时:

df.apply(lambda x: x.dtype)

您将得到:

Date          object
CAD 12M PR    object
AUD 12M PR    object
NOK 12M PR    object
SEK 12M PR    object
NZD 12M PR    object
EUR 12M PR    object
GBP 12M PR    object
JPY 12M PR    object
CAD 1Y ZS     object
AUD 1Y ZS     object
NOK 1Y ZS     object
SEK 1Y ZS     object
NZD 1Y ZS     object
EUR 1Y ZS     object
GBP 1Y ZS     object
JPY 1Y ZS     object

。。。因为混合型。你知道吗

相反,您应该将日期设为DateTimeIndex,这样列中的所有数据类型都是浮动的。你知道吗

df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')

这将为您提供可以应用nlargest的值。我没有应用任何附加逻辑,因为我假设您的主要问题是数据类型。你知道吗

不过,你应该公布你的预期结果,以获得更完整的答案。我怀疑,如果你采用这种方法,你将在所有日期获得每种货币最大的1200万美元的公关(相当于max)。如果你想要前4名,你需要做一个额外的nlargest(4)来捕获它们。例如

df[['CAD 12M PR', 'AUD 12M PR', 'NOK 12M PR', 'SEK 12M PR', 'NZD 12M PR',
       'EUR 12M PR', 'GBP 12M PR', 'JPY 12M PR']].max(axis=0).nlargest(4)

为所有日期和货币提供4个最大的12米公关分数。这可能不是你想要的,很难说。你知道吗

相关问题 更多 >