我有一個 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
uj5u.com熱心網友回復:
這是一種使用串列理解來做到這一點的方法:
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
uj5u.com熱心網友回復:
該檔案具有與此相關的一個例子:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325866.html
下一篇:有沒有辦法像這樣比較df中的列?
