This question already has answers here:
Vectorized lookup on a pandas dataframe
(3个答案)
6个月前关闭。
我有一个pandas DataFrame,在许多列中都有值,为简单起见,将其设置为两个,还有一列我想用来从其他列中选择值的列名:
这使
也就是说,我希望从列
这有效:
但这感觉是如此脆弱和笨拙。有一个更好的方法吗?
理解
但是为什么当你有
奖金黑客
不适用于实际用途
因为
FutureWarning:不建议使用
(3个答案)
6个月前关闭。
我有一个pandas DataFrame,在许多列中都有值,为简单起见,将其设置为两个,还有一列我想用来从其他列中选择值的列名:
import pandas as pd
import numpy as np
np.random.seed(1337)
df = pd.DataFrame(
{"a": np.arange(10), "b": 10 - np.arange(10), "c": np.random.choice(["a", "b"], 10)}
)
这使
> df['c']
0 b
1 b
2 a
3 a
4 b
5 b
6 b
7 a
8 a
9 a
Name: c, dtype: object
也就是说,我希望从列
b
中选择第一个和第二个元素,从a
中选择第三个,依此类推。这有效:
def pick_vals_from_cols(df, col_selector):
condlist = np.row_stack(col_selector.map(lambda x: x == df.columns))
values = np.select(condlist.transpose(), df.values.transpose())
return values
> pick_vals_from_cols(df, df["c"])
array([10, 9, 2, 3, 6, 5, 4, 7, 8, 9], dtype=object)
但这感觉是如此脆弱和笨拙。有一个更好的方法吗?
最佳答案
df.lookup(df.index, df.c)
array([10, 9, 2, 3, 6, 5, 4, 7, 8, 9])
理解
但是为什么当你有
lookup
的时候呢?[df.at[t] for t in df.c.items()]
[10, 9, 2, 3, 6, 5, 4, 7, 8, 9]
奖金黑客
不适用于实际用途
[*map(df.at.__getitem__, zip(df.index, df.c))]
[10, 9, 2, 3, 6, 5, 4, 7, 8, 9]
因为
df.get_value
已过时[*map(df.get_value, df.index, df.c)]
FutureWarning:不建议使用
get_value
,并将在以后的版本中将其删除。请改用.at[]
或.iat[]
访问器[10, 9, 2, 3, 6, 5, 4, 7, 8, 9]
09-30 13:50