python - 循环遍历 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
编辑:在申请回答 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
推荐阅读
- php - PHP xmllib XSD 验证命名空间错误:不期望 X,期望 X
- r - 如果在一个函数中我将获得正面的概率设置为 0.7,那么为什么在 100 次投掷后我得到 65 的结果?
- pandas - Replacing values that are larger than a specific parameter
- matlab - 如何使用不同的序列号重复打印一个变量
- swift - 将 SwiftUI 与动画延迟链接 - 仅显示最后一个动画,除非对象是显示所有动画的中间动画
- c# - 有没有办法从方法中调用对象?
- regex - notepad++的正则表达式和替换
- vba - 将excel导入vba访问的现有表时出错
- swift - 更新 Xcode 后故事板本地化不起作用
- c# - 如何从 CLR 存储过程中获取结果