我有这个空的pandas数据框和一个函数值(x,y),它带有2个参数,即pandas数据框中点的行号和列号。我想知道是否有一种更简单的方法可以使用这些参数(也许使用df.apply)遍历整个空数据框。
我知道可以遍历每个单独的列并在单独的列上运行df.apply,但是有可能这样做而无需运行任何循环。
基本上,我正在寻找可以在整个数据帧上运行的类似内容
df_copy.apply(lambda x: myfunction(x.value, x.column))
但是,x.column不存在,所以它有另一种实现方式,或者我做错了什么事
谢谢!
答案 0 :(得分:1)
是的,请使用一系列的name
和index
属性:
df = pd.DataFrame(1, index = np.arange(10,51,10), columns = np.arange(5))
显示输入数据框
0 1 2 3 4
10 1 1 1 1 1
20 1 1 1 1 1
30 1 1 1 1 1
40 1 1 1 1 1
50 1 1 1 1 1
让我们定义自定义函数,并使用行作为列来进行计算。
def f(x):
#add row values to column values
return x.name + x.index
df.apply(f)
输出:
0 1 2 3 4
10 10 11 12 13 14
20 20 21 22 23 24
30 30 31 32 33 34
40 40 41 42 43 44
50 50 51 52 53 54
注意:apply
正在将数据帧(是pd.Series)的每一列传递给函数f。每个系列都有一个属性name
(这是列标题)和index
(这是数据帧行索引)。因此,函数f为数据框的每一列返回一个计算得出的pd.Series,并作为一个数据框放回去。
回答中的问题,让我们使用字符串:
df = pd.DataFrame(1, index=['Ted','Bill','Ralph','John','Tim'], columns=['A','B','C','D','E'])
def f(x):
#Concatenate row values with column values
return x.index + '_' + x.name
df.apply(f)
或使用lambda函数
df.apply(lambda x: x.index + '_' + x.name)
输出:
A B C D E
Ted Ted_A Ted_B Ted_C Ted_D Ted_E
Bill Bill_A Bill_B Bill_C Bill_D Bill_E
Ralph Ralph_A Ralph_B Ralph_C Ralph_D Ralph_E
John John_A John_B John_C John_D John_E
Tim Tim_A Tim_B Tim_C Tim_D Tim_E