我正在尝试为热图或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的一些漂亮组合。
有没有办法以更智能/矢量化的方式获得相同的结果?
提前致谢!
答案 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)