python - 将列比例转换为 1 到 10 的范围
问题描述
我正在尝试使用函数创建一组新列,这些列将派生自数据框中的现有列。这是产生错误的示例代码,我想知道是否有比循环更有效的方法来完成它
import numpy as np
import pandas as pd
dates = pd.date_range('1/1/2000', periods=100, freq='M')
long_df = pd.DataFrame(np.random.randn(100, 4),index=dates, columns=['Colorado', 'Texas', 'New York', 'Ohio'])
mylist=['Colorado', 'Texas', 'New York', 'Ohio']
def trnsfrm_1_10 (a, b):
b = (a-np.min(a))/(np.max(a)-np.min(a))*9+1
return b
for a in mylist:
b=a+"_T"
long_df[b] = long_df.apply(lambda row: trnsfrm_1_10(row[a], row[b]), axis=1)
为了澄清上述问题,这里是具有输入列(科罗拉多州、德克萨斯州、纽约州)和输出变量(T_Colorado、T_Texas、T_New York)的 DataFrame 示例。假设对于每个输入变量,以下是每列的最小值和最大值,然后通过对每列应用等式:b = (a-min)/(max-min)*9+1,输出变量为 T_Colorado T_Texas T_New约克。我必须在 excel 中仅基于 5 行来模拟这个过程,但是将最小值和最大值作为函数的一部分来计算会很棒,因为我在真实数据中会有更多的行。我对 Python 和 Pandas 比较陌生,非常感谢您的帮助。
这些是示例最小值和最大值
Colorado Texas New York
min 0.03 -1.26 -1.04
max 1.17 0.37 0.86
这是 DataFrame 的示例
Index Colorado Texas New York T_Colorado T_Texas T_New York
1/31/2000 0.03 0.37 0.09 1.00 10.00 6.35
2/29/2000 0.4 0.26 -1.04 3.92 9.39 1.00
3/31/2000 0.35 -0.06 -0.75 3.53 7.63 2.37
4/30/2000 1.17 -1.26 -0.61 10.00 1.00 3.04
5/31/2000 0.46 -0.79 0.86 4.39 3.60 10.00
解决方案
IIUC,你应该利用广播
long_df2= (long_df - long_df.min())/(long_df.max() - long_df.min()) * 9 + 1
然后concat
pd.concat([long_df, long_df2.add_suffix('_T')], 1)
推荐阅读
- integer - python中从float到int的值错误转换(非常奇怪的问题)
- google-apps-script - 尽管满足脚本条件,但我的 onEdit Timestamp 脚本无法在某些行上运行
- mysql - 当另一列满足条件时获取一列的值
- python - 在 Pandas 中对多索引数据框中的列内容求和
- gitlab - 将多个 Gitlab 版本组合成一个主版本的最佳方法?
- javascript - 是否可以仅重新加载 Vue.js 中的某个组件?
- javafx - 在 Java FX Scene Builder 中添加自定义控件
- java - 动态 Json 响应映射到 Pojo
- docker - 基于 Openshift 的 Docker 多阶段构建
- jenkins - 当pytest作业测试失败时如何使管道阶段网格显示为不稳定