首页 > 解决方案 > 使用 .apply() 和 Range 函数在索引级别的 Pandas Dataframe 中创建列表

问题描述

数据框快照

我正在尝试使用 range 函数在我的数据框中的每个索引级别创建一个列表。该列表的起始值应等于“95_moneyness”,结束值应为“105_moneyness”,步长值为 5。例如,在 Index = 1 时,列表应如下所示:[3095, 3100, 3105, 3110,.. .,3420]。到目前为止,我已经尝试了以下代码:

df2.apply(range(df2['95_moneyness'], df2['105_moneyness'], 5), axis=0)

我收到以下错误:

'Series' object cannot be interpreted as an integer.

我想这是我试图将系列传递给范围而不是整数的结果。

有人可以推荐一个解决方案吗?我考虑过可能为此定义我自己的自定义范围函数,或者对完全不同的方法持开放态度。

非常感谢!

标签: pythonpandasindexingrangeapply

解决方案


因此,问题在于您使用df的是行变量而不是行变量。此外,您需要将轴更改为axis=1以迭代行。最后,您需要将float值转换为int.

简而言之,该命令应如下所示:

df.apply(lambda x: range(int(x['95_moneyness']), int(x['105_moneyness']), 5), axis=1)

这是一个最小的例子:

import pandas as pd

df = pd.DataFrame({"95_moneyness": [3095.0, 3075.0, 3085.0, 3075.0, 3095.0],
                    "105_moneyness": [3420.0, 3395.0, 3410.0, 3400.0, 3415.0]})

df["new"] = df.apply(lambda x: range(int(x['95_moneyness']), int(x['105_moneyness']), 5), axis=1)
print(df)
#   95_moneyness  105_moneyness                                                new
#0        3095.0         3420.0  (3095, 3100, 3105, 3110, 3115, 3120, 3125, 313...
#1        3075.0         3395.0  (3075, 3080, 3085, 3090, 3095, 3100, 3105, 311...
#2        3085.0         3410.0  (3085, 3090, 3095, 3100, 3105, 3110, 3115, 312...
#3        3075.0         3400.0  (3075, 3080, 3085, 3090, 3095, 3100, 3105, 311...
#4        3095.0         3415.0  (3095, 3100, 3105, 3110, 3115, 3120, 3125, 313...

推荐阅读