当索引值包含在单独的numpy数组中时,访问Pandas数据帧值

时间:2017-07-24 15:51:56

标签: python pandas numpy

我有一个超过200万array的n int

a = np.array([324, 986, 574 ... 986, 1232, 3943])

a中的每个元素都对应于数据框df中具有形状(1324,4)的索引值:

index A     B C D
0     'foo' 2 3 2
1     'bar' 2 4 8
...
1323  'foo' 2 5 8

我正在尝试使用列表解析来访问df.A的值:

l = [df.A.loc[i] for i in a]

但这需要很长时间才能运行。有更快的选择;也许我需要做一个join?谢谢。

2 个答案:

答案 0 :(得分:4)

如果a中的值与数据框索引中的值相对应,则应该只能使用.loc[a];如果a中的值指的是位置,那么您需要.iloc[a];如果您需要numpy数组作为结果,如@Scott所评论,请使用df.A.loc[a].values

df.A.loc[a]

实施例

df = pd.DataFrame({
        "A": ["a", "c", "b", "d"]
    })

a = np.array([0,3,2,2,1,1,0])

df.A.loc[a]
#0    a
#3    d
#2    b
#2    b
#1    c
#1    c
#0    a
#Name: A, dtype: object

df.A.loc[a].values
# array(['a', 'd', 'b', 'b', 'c', 'c', 'a'], dtype=object)

答案 1 :(得分:1)

这可以通过布尔索引来完成:

a = np.array([324, 986, 574, 986, 1232, 3943])

df
   some_column
0            1
1            2
2            3
3            5
4          324
5          574
6          986
7         3943

df[df['some_column'].isin(a)]
   some_column
4          324
5          574
6          986
7         3943

df[df['some_column'].isin(a)].values
array([[ 324],
       [ 574],
       [ 986],
       [3943]], dtype=int64)

同样,如果数组值与索引相对应:

df[df.index.isin(a)]