首页 > 解决方案 > 将列比例转换为 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

标签: pythonpandasnumpy

解决方案


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)

推荐阅读