通过iloc pandas函数使用

问题描述

我有一个包含40列的数据集,我想定义一个操作这些列的函数

例如,

p = {'val1': [10,20,30,40],'val2': [15,25,35,45]}

data = pd.DataFrame(p,columns=['val1','val2'])
data

我有此数据,并且执行了以下操作

inc = 100*((data.iloc[:,-1]/ data.iloc[:,-1-1])-1)
inc

结果是

0    50.000000
1    25.000000
2    16.666667
3    12.500000
dtype: float64

我要选择最大值和最大值的索引,我做了以下

(inc.idxmax(),max(inc))

我获得了以下结果

(0,50.0)

现在,我定义一个函数

def increase(column):
    inc = 100*((data.iloc[:,-column]/ data.iloc[:,-column-1])-1)
    return (inc.idxmax(),max(inc))

我向后选择列。

并且我想将此功能应用于所有列

new_data = data.apply(increase)

使用此工具时出现错误

IndexError: positional indexers are out-of-bounds

如果我使用applymap,则会遇到相同的错误

我该怎么办?

解决方法

如果我理解正确,您想在函数中使用多个列。 此处的解决方案不是解决方案,因为它当时只在一行或一列(轴= 0或1)上工作。

所以我的建议是给我们,这样每次迭代输入2列:

def increase(col1,col2):
   inc = 100*((col2/ col1)-1)
   return (inc.idxmax(),max(inc))

lst = []
for i in range(len(data.columns)):
    j=i+1
    if j<len(data.columns):
        col1 = data[data.columns[i]]
        col2 = data[data.columns[j]]
        lst.append(increase(col1,col2))

pd.DataFrame(lst)

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...