1.目的
论文中需要对数据进行归一化处理,使用spsspro软件正向和负向指标处理的公式处理数据后, 归一化的值偏大,用EXCEL计算又感觉有些麻烦,于是想着自己写个几行代码,自己定义公式。
2. 自己写的代码
import pandas as pd
# 指定文件路径
PATH = r"C:\Users\31911\Desktop\test2018.xlsx"
# 读取Excel文件
df = pd.read_excel(PATH)
# 应用转换公式并将结果存储在新列中
for name in df.columns:
# 计算当前列的最大值和最小值
max_value = df[name].max()
min_value = df[name].min()
# 创建新列名,避免覆盖原始列
new_column_name = name + '_N'
# 应用转换公式
df[new_column_name] = (df[name] - 0.1 * min_value) / (2 * max_value - 0.1 * min_value)
# 将处理后的数据存储回Excel文件
# 如果需要覆盖原文件,可以使用sheet_name='Sheet1'指定工作表名称
df.to_excel(PATH, index=False, header=True, engine='openpyxl')
print("数据已成功处理并存储到Excel文件。")
需要注意的地方是name是动态的,所以不需要加上''
3. 精简后的代码
import pandas as pd
# 指定文件路径
PATH = r"C:\Users\31911\Desktop\test2018.xlsx"
# 读取Excel文件
df = pd.read_excel(PATH)
# 定义转换函数
def transform(x):
max_value = x.max()
min_value = x.min()
return (x - 0.1 * min_value) / (2 * max_value - 0.1 * min_value)
# 应用转换函数到每一列,并存储在新列中
df_transformed = df.apply(transform)
# 将处理后的数据存储回Excel文件
df_transformed.to_excel(PATH, index=False, header=True, engine='openpyxl')
print("数据已成功处理并存储到Excel文件。")
4.知识点学习
4.1 apply()的用法
apply()
方法在 Pandas 中非常有用,它允许将一个函数应用于 DataFrame 的行或列。
apply()
默认应用于DataFrame的列。如果您想对行应用函数,需要设置 axis=1
。
import pandas as pd
# 创建一个示例DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
# 定义一个简单的函数,比如求和
def my_function(x):
return x.sum()
# 应用函数于每一列,axis=0表示沿着列的方向
result_by_column = df.apply(my_function, axis=0)
print(result_by_column)
# 应用函数于每一行,axis=1表示沿着行的方向
result_by_row = df.apply(my_function, axis=1)
print(result_by_row)
4.2 lambda 函数的应用
lambda
函数是一种使用简洁的语法来创建匿名函数的方法。在Python中,lambda
函数可以接收任意数量的参数,但只能包含一个表达式,而不是一个块语句。表达式的结果是这个 lambda
函数的返回值。
lambda arguments: expression
arguments
:参数列表,可以是任意数量和类型的参数。expression
:一个表达式,返回值即lambda
函数的结果。
1.示例1
# 创建一个lambda函数,计算两个数的和
add = lambda x, y: x + y
# 使用lambda函数
result = add(5, 3)
print(result) # 输出: 8
2.示例2
# 创建一个lambda函数,返回字符串的长度
length = lambda s: len(s)
# 使用lambda函数
result = length("hello")
print(result) # 输出: 5
3.示例3
# 创建一个lambda函数,根据条件返回不同的值
conditional = lambda x: "positive" if x > 0 else "negative"
# 使用lambda函数
result = conditional(10)
print(result) # 输出: "positive"
result = conditional(-5)
print(result) # 输出: "negative"
4.示例4
# 创建一个列表
numbers = [5, 3, 8, 1, 2]
# 使用lambda函数进行排序
sorted_numbers = sorted(numbers, key=lambda x: -x)
print(sorted_numbers) # 输出: [8, 5, 3, 2, 1]
4.3 map()函数
map()
函数是Python中用于对可迭代对象中的每个元素应用指定函数的内置函数。它接收两个参数:第一个是一个函数,第二个是一个可迭代对象。map()
函数将传入的函数应用于可迭代对象的每个元素,并返回一个新的迭代器。
map(function, iterable, ...)
function
:要应用于每个元素的函数。这可以是内建函数或自定义函数。iterable
:一个或多个可迭代对象,例如列表、元组、字典等。示例1:使用内建函数 python numbers = [1, 2, 3, 4] doubled_numbers = map(lambda x: x * 2, numbers) print(list(doubled_numbers)) # 输出: [2, 4, 6, 8] 示例2:使用自定义函数 python def square(x): return x ** 2 numbers = [1, 2, 3, 4] squared_numbers = map(square, numbers) print(list(squared_numbers)) # 输出: [1, 4, 9, 16] 示例3:使用多个可迭代对象 map() 也可以接收多个可迭代对象,并将函数应用于它们的对应元素。 python numbers = [1, 2, 3, 4] multipliers = [2, 3, 4, 5] result = map(lambda x, y: x * y, numbers, multipliers) print(list(result)) # 输出: [2, 6, 12, 20] 注意事项 map() 总是返回一个迭代器,即使它只处理一个元素。 如果要处理的数据量很大,使用 map() 可能比列表推导式更节省内存,因为迭代器是按需计算的。 当函数逻辑非常简单时,使用 lambda 函数可以提高代码的简洁性。 在Python 3中,map() 不再返回列表,而是返回一个迭代器。要将结果转换为列表,需要使用 list() 函数。
4.4 items()和iterrows()方法
在Pandas中,items()
方法是一个用于遍历DataFrame或Series中(键-值)对的方法。items()
方法更常见于Python的标准字典对象。DataFrame本身并没有直接的items()
方法用于遍历行。但你可以使用iterrows()
来遍历DataFrame的行,它会返回每行的索引和该行的数据(作为Series)。
import pandas as pd
# 创建一个示例DataFrame
df = pd.DataFrame({
'x1': [1, 2, 3, 4],
'x2': [5, 6, 7, 8]
})
print(df)
# 使用items()方法遍历DataFrame中的列和数据
for col_name, col_data in df.items():
print(f"列名: {col_name}")
for idx, value in col_data.items(): # 注意这里使用iteritems()来遍历Series的索引和值
print(f" 索引: {idx}, 值: {value}")
iterrows()
是 Pandas DataFrame 的一个方法,它用于按行遍历 DataFrame 中的数据。每次迭代,iterrows()
都会返回一个包含行索引和行数据的元组。行索引是行的标签,而行数据则是该行对应值的 Series 对象。
import pandas as pd
# 创建一个简单的 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
# 使用 iterrows() 遍历 DataFrame
for index, row in df.iterrows():
print(f'Index: {index}')
print(f'A: {row["A"]}, B: {row["B"]}, C: {row["C"]}')