[英]Loop through columns in Pandas dataframe
我有一個熊貓數據框,想遍歷所有列並執行一些數學函數。 但是,無法獲得所需的結果。以下是我的 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
編輯:在申請回答 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.