我有一个系列和数据框
import pandas as pd
import numpy as np
s = pd.Series(['x', 'y', 'z'], ['a', 'b', 'c'])
df = pd.DataFrame(np.arange(9).reshape(3, 3), s.index, s.values)
我想使用s
来选择df
的元素。我想要一系列:
[df.loc['a', 'x'], df.loc['b', 'y'], df.loc['c', 'z']]
答案 0 :(得分:4)
您可以使用lookup
:
df.lookup(s.index, s.values)
[0 4 8]
或者作为熊猫。系列:
pd.Series(df.lookup(s.index, s.values), s.index)
a 0
b 4
c 8
<强>计时强>
使用比问题中更大的数据:
from string import ascii_lowercase, ascii_uppercase
s = pd.Series(list(ascii_lowercase), list(ascii_uppercase))
df = pd.DataFrame(np.arange(26**2).reshape(26, 26), s.index, s.values)
产生以下时间:
%timeit pd.Series(df.lookup(s.index, s.values), s.index)
1000 loops, best of 3: 241 μs per loop
%timeit pd.Series([df.at[i, s[i]] for i in s.index], s.index)
1000 loops, best of 3: 770 μs per loop
%timeit pd.Series([df.ix[ind,col] for ind, col in s.iteritems()], s.index)
1000 loops, best of 3: 381 μs per loop
答案 1 :(得分:2)
在at
理解中使用list
。
pd.Series([df.at[i, s[i]] for i in s.index], s.index)
a 0
b 4
c 8
dtype: int64
我离开这里了,但这并不足够,正如@root所指出
只需列出/数组
构建系列
答案 2 :(得分:2)
刚刚开始
In [295]: %timeit pd.Series([df.at[i, s[i]] for i in s.index], s.index)
10000 loops, best of 3: 96.5 µs per loop
In [296]: %timeit pd.Series([ df.ix[ind,col] for ind, col in s.iteritems() ], s.index)
10000 loops, best of 3: 86.3 µs per loop