Python 循环遍历数据帧中的列

Python 循环遍历数据帧中的列,python,pandas,Python,Pandas,我有一个pandas数据框架,希望遍历所有列并执行一些数学函数。但是,无法获得所需的结果。下面是我的示例数据框,共有3列 mydf=pd.DataFrame({'ID1':[9,3,7,5], 'ID2':[15,10,3,8],'ID3':[20,14,10,2]}) mydf ID1 ID2 ID3 0 9 15 20 1 3 10 14 2 7 3 10 3 5 8 2 下面是我需要为所有专栏所做的,它工作得非常完美。然而,这只是一

我有一个pandas数据框架,希望遍历所有列并执行一些数学函数。但是,无法获得所需的结果。下面是我的示例数据框,共有3列

mydf=pd.DataFrame({'ID1':[9,3,7,5], 'ID2':[15,10,3,8],'ID3':[20,14,10,2]})

mydf

  ID1   ID2 ID3
0   9   15  20
1   3   10  14
2   7   3   10
3   5   8   2
下面是我需要为所有专栏所做的,它工作得非常完美。然而,这只是一个示例玩具数据集,在我的实际数据帧中有500多列,我试图循环遍历所有列,但它没有给出期望的结果

tmp_df=mydf.copy()

tmp_df['ID1']=np.log(mydf.iloc[:,0]).diff(1)
tmp_df['ID2']=np.log(mydf.iloc[:,1]).diff(1)
tmp_df['ID3']=np.log(mydf.iloc[:,2]).diff(1)
tmp_df

    ID1          ID2             ID3
0   NaN          NaN             NaN
1   -1.098612   -0.405465   -0.356675
2   0.847298    -1.203973   -0.336472
3   -0.336472   0.980829    -1.609438
基本上,我需要上面的结果,使用循环作为

我有500个专栏要做

我试过这样做:

for (i,j) in tmp_df.iteritems():
    #tmp_df['j']=np.log(mydf.iloc[:,0]).diff(1)
    j=np.log(mydf.iloc[:,0]).diff(1)
    print('Column:',i)
    print('Values:',j.values)
但是,这个循环在列表中给出了值,并且没有像我所希望的那样对所有列进行迭代。我认为这可以很容易地做到,但我无法让它工作。如果有人能帮助我,为所有500个专栏提供有效的方法,我将不胜感激

使用任何循环逻辑的预期结果

ID1           ID2             ID3
0   NaN           NaN             NaN
1   -1.098612   -0.405465   -0.356675
2   0.847298    -1.203973   -0.336472
3   -0.336472   0.980829    -1.609438

一种方法是使用
apply
,无需迭代行

In [48]: mydf=pd.DataFrame({'ID1':[9,3,7,5], 'ID2':[15,10,3,8],'ID3':[20,14,10,2]})

In [49]: mydf.apply(lambda x: np.log(x).diff(1), axis='rows')
Out[49]:
        ID1       ID2       ID3
0       NaN       NaN       NaN
1 -1.098612 -0.405465 -0.356675
2  0.847298 -1.203973 -0.336472
3 -0.336472  0.980829 -1.609438
结果是一个数据帧,因此如果需要将结果保存在新的数据帧中,只需像往常一样进行设置

In [50]: new_mydf = mydf.apply(lambda x: np.log(x).diff(1), axis='rows')

In [51]: print(new_mydf)
        ID1       ID2       ID3
0       NaN       NaN       NaN
1 -1.098612 -0.405465 -0.356675
2  0.847298 -1.203973 -0.336472
3 -0.336472  0.980829 -1.609438
编辑:在apply to answer OP注释后添加更多详细信息以重命名列

In [58]: new_mydf = mydf.apply(lambda x: np.log(x).diff(1), axis='rows').rename(lambda c_name: f'new_{c_name}', axis='columns')

In [58]: print(new_mydf)
    new_ID1   new_ID2   new_ID3
0       NaN       NaN       NaN
1 -1.098612 -0.405465 -0.356675
2  0.847298 -1.203973 -0.336472
3 -0.336472  0.980829 -1.609438

np.log(mydf).diff()
?anky_91:是的,我需要它来获取日志并用1级以上的值进行区分。但是,我关心的不是数学函数,而是如何使用循环有效地完成这项工作,因为我无法为500列编写代码。如果你能帮上忙,我将不胜感激。谢谢,但是当
np.log
将整个df作为输入时,为什么要使用循环呢?您是否尝试过
np.log(mydf.diff()
,它提供了与预期相同的输出
apply
还通过行循环Smichaeld:太好了,非常感谢……它按预期工作。顺便问一下,我可以在apply函数之后用任何前缀重命名列吗?假设我想将cols ID1、ID2、ID3重命名为new_ID1、new_ID2、new_ID3等。但是,出于某种奇怪的原因,重命名似乎对我不起作用,即使我只是复制/粘贴了你的代码。我检查了所有的引号,括号等,似乎没有什么是关闭…顺便说一句,我的熊猫版本是'0.23.4'。new_df1=mydf.apply(lambda x:np.log(x).diff(1),axis='rows').rename(lambda c_name:f'new_{c_name},axis='columns')^SyntaxError:invalid syntaxI我使用的是pandas的24.2版,但是rename函数应该没有区别。您在使用Python 3吗?是的,我在使用Python 3(更具体地说是3.5.6)