有没有办法根据一系列列名访问数据框中的值?

Is there a way to access values in dataframe based on series of column names?

我有一个 pandas 数据框,其中包含一列值和一个 pandas 系列,其中包含列名。我需要获取与系列中列名称的第 n 个索引对应的列的第 n 行的值。 请注意,columna 名称是通过将 col 附加到系列中的值来构造的。 我已经查看是否有一种方法可以使用快速(矢量化或列表理解)方法来执行此操作,但似乎遇到了障碍,我使用系列的索引位置索引到数据帧中。

dataframe : {
'col1': [1, 2, 3, 4, 5],
'col2': [10, 20, 30, 40, 50],
'col3': [100, 200, 300, 400, 500]
}

series : [
'1', '2', '1', '3', '8'
]

output is a series : [
1, 20, 3, 400, numpy.nan
]

我可以使用简单的 iterrows 来做到这一点,但想要更快的东西(最好是矢量化,但如果不是列表理解)。

def test_cols():
    stub_data_df = pd.DataFrame({
        'col1': [1, 2, 3, 4, 5],
        'col2': [10, 20, 30, 40, 50],
        'col3': [100, 200, 300, 400, 500]
    })
    cols = pd.Series([
        '1', '2', '1', '3', '8'
    ])
    rates = []
    for i, row in stub_data_df.iterrows():
        rates.append(row.get('col' + cols[i]))
    print(pd.Series(rates))

输出:

0      1.0
1     20.0
2      3.0
3    400.0
4      NaN
dtype: float64

这里有一种通过列表推导来做到这一点的方法:

df = pd.DataFrame({'col1': [1, 2, 3, 4, 5],
                   'col2': [10, 20, 30, 40, 50],
                   'col3': [100, 200, 300, 400, 500]})
s = pd.Series(['1', '2', '1', '3', '8'])

s = s.astype(int) - 1  # so these values can be used for integer indexing
result = s.copy()

legal_ix = s < len(df.columns)  # only columns that exist can be indexed
s = s[legal_ix] 

result[legal_ix] = [df.iloc[i, j] for i, j in zip(s.index, s.values)]
result[~legal_ix] = np.nan

print(result)
0      1.0
1     20.0
2      3.0
3    400.0
4      NaN
dtype: float64

docs 有一个与此相关的示例:

 idx, cols = ('col' + cols).factorize()

array = stub_data_df.reindex(cols, axis = 1).to_numpy()
array = array[np.arange(len(stub_data_df)), idx]

pd.Series(array)

0      1.0
1     20.0
2      3.0
3    400.0
4      NaN
dtype: float64