Pandas DataFrame:以索引和列值作为参数以单元格方式应用函数

时间:2017-02-20 12:18:57

标签: python pandas

我正在尝试为热图或3D绘图准备一些数据。一般的想法是我有一些函数z = f(x,y)其中z是特定单元格的值,其中x作为列值,y作为索引值。

我目前的做法是循环显示已经显示所需结果的数据帧:

import numpy as np
import pandas as pd


def my_fun(a, b):
    return(a**2 + b**3)

index = [i for i in np.arange(25.0, 100.0, 25.0)]
columns = [i for i in np.arange(150.0, 600.0, 150.0)]
df = pd.DataFrame(np.zeros((3, 3)), index=index, columns=columns)

for idx in index:
    for col in columns:
    df.loc[idx, col] = my_fun(idx, col)

print(df)

和产量:

      150.0       300.0       450.0
25.0  3375625.0  27000625.0  91125625.0
50.0  3377500.0  27002500.0  91127500.0
75.0  3380625.0  27005625.0  91130625.0

但循环数据框可能不是处理这个问题的正确(矢量化)方式,而我正在寻找apply/applymap/map的一些漂亮组合。

有没有办法以更智能/矢量化的方式获得相同的结果?

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以使用:

Series

如果您的功能需要使用标量,df可以unstack,请转换为df1 = df.stack().to_frame().apply(lambda x: my_fun(x.name[0], x.name[1]), axis=1).unstack() print (df1) 1 2 3 1 2 3 4 2 3 4 5 3 4 5 6 ,应用函数并持续lambda

def f(x):
    print (x.name)
    print (x.index)
    return x.index + x.name
1
Int64Index([1, 2, 3], dtype='int64')
1
Int64Index([1, 2, 3], dtype='int64')
2
Int64Index([1, 2, 3], dtype='int64')
3
Int64Index([1, 2, 3], dtype='int64')

print (df.apply(f, axis=1))

   1  2  3
1  2  3  4
2  3  4  5
3  4  5  6

最好进行测试,而{{1}}使用一些自定义函数,例如:

{{1}}

答案 1 :(得分:0)

实际上,您可以简单地利用apply函数逐列操作,因为列是pandas.Series,因此知道列索引始终可用:

import numpy as np
import pandas as pd


def my_fun(col):
    # both are numpy arrays, col.values gives the inner value of the whole column
    # operations here use the fast numpy primitives
    return col.index + col.values  

index = [i for i in range(1, 4)]
columns = ['col' + str(i) for i in range(1, 4)]
df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=index, columns=columns)

col_names = ['col1', 'col2']  # alternatively you can use an array of columns indices such as [1, 2]
df[col_names].apply(my_fun)
print(df)