有没有办法根据一系列列名访问数据框中的值?
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
我有一个 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