“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 访问它的开销也较低,但这两者都只是猜测。如果有人知道更好,请发表评论。
我还没有研究过列数与行数对计时结果的影响。