'getattr' 的方法可以达到效果,但是还有一种稍微更快的选择。
idx = {name: i for i, name in enumerate(list(df), start=1)}
for row in df.itertuples(name=None):
example_value = row[idx['product_price']]
解释
创建一个将列名映射到行位置的字典。使用 "name=None" 调用 'itertuples'。然后使用从字典中获取的列名的索引来访问每个元组中的所需值。
- 创建一个字典以查找索引。
idx = {name: i for i, name in enumerate(list(df), start=1)}
- 使用字典按名称访问行元组中所需的值
for row in df.itertuples(name=None):
example_value = row[idx['product_price']]
注意:如果使用
index=False
调用 itertuples,则在
enumerate
中使用
start=0
。
下面是一个可行的示例,展示了两种方法以及它们的时间。
import numpy as np
import pandas as pd
import timeit
data_length = 3 * 10**5
fake_data = {
"id_code": list(range(data_length)),
"letter_code": np.random.choice(list('abcdefgz'), size=data_length),
"pine_cones": np.random.randint(low=1, high=100, size=data_length),
"area": np.random.randint(low=1, high=100, size=data_length),
"temperature": np.random.randint(low=1, high=100, size=data_length),
"elevation": np.random.randint(low=1, high=100, size=data_length),
}
df = pd.DataFrame(fake_data)
def iter_with_idx():
result_data = []
idx = {name: i for i, name in enumerate(list(df), start=1)}
for row in df.itertuples(name=None):
row_calc = row[idx['pine_cones']] / row[idx['area']]
result_data.append(row_calc)
return result_data
def iter_with_getaatr():
result_data = []
for row in df.itertuples():
row_calc = getattr(row, 'pine_cones') / getattr(row, 'area')
result_data.append(row_calc)
return result_data
dict_idx_method = timeit.timeit(iter_with_idx, number=100)
get_attr_method = timeit.timeit(iter_with_getaatr, number=100)
print(f'Dictionary index Method {dict_idx_method:0.4f} seconds')
print(f'Get attribute method {get_attr_method:0.4f} seconds')
结果:
Dictionary index Method 49.1814 seconds
Get attribute method 80.1912 seconds
我认为,元组与命名元组之间的差异在于创建元组时的开销较低,而通过索引访问元组的开销也较低,但这些只是猜测。如果有人知道更好的请留言。
我还未探究列数与行数如何影响计时结果。
getattr(my_car, field)
或my_car._asdict()[field]
。这两个表达式都是用来获取对象属性的值,其中getattr()
是一个内置函数,它接受一个对象和一个字符串作为参数,并返回该对象上具有指定名称的属性的值。而_asdict()
是用于将命名元组转换为字典的方法,可以使用中括号索引符号来访问其中的字段,从而获得该字段的值。 - Ashwini Chaudharymycar[field]
,但这时你可能需要使用for row in data
进行迭代。 - Asclepius