使用series来获取数据框中的值

时间:2016-07-19 21:30:30

标签: python pandas

我有一个系列和数据框

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']]

3 个答案:

答案 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所指出

只需列出/数组

enter image description here

构建系列

enter image description here

答案 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