Python Pandas:从数据帧中迭代提取Numpy数组

Python Pandas:从数据帧中迭代提取Numpy数组,python,numpy,pandas,Python,Numpy,Pandas,我有一个数据框,有6676行和40列。这是感兴趣的两列的截断版本 user_id pos 0 1520304915 0.3612 1 1520304915 0.0000 2 1520278540 0.0000 3 1520302105 0.4404 4 1520278547 -0.1531 5 1520303294 0.4404 6 1520278540 -0.1027 7 1522888020 0.9512 8

我有一个数据框,有6676行和40列。这是感兴趣的两列的截断版本

    user_id      pos
0   1520304915   0.3612
1   1520304915   0.0000
2   1520278540   0.0000
3   1520302105   0.4404
4   1520278547   -0.1531
5   1520303294   0.4404
6   1520278540   -0.1027
7   1522888020   0.9512
8   1520302847   0.7192
9   1523490451   0.8689
我还有一个单独的用户id列表

0    1528106864
1    1520303069
2    1520305391
3    1521519315
4    1520303294
5    1520302954
6    1520302702
7    1528108709
8    1520278540
9    1520304915
如果列表中存在“user\u id”,我想迭代提取每个“user\u id”的“pos”值的单个numpy数组。这将返回10个单独的数组

数组的长度不同,因为数据帧中有可变的用户id

下面是两个从上面截短的数据中提取的数组的示例。。。这主要是一个基于上述数值的可视化辅助工具

1520304915:
([0.3612,0.0000,…

1520278540:
([0.0000,-0.1027,

您可以使用方法使用
列表用户id
对数据帧进行子集。然后通过
用户id
列和
agg
将变量转换为列表:

In [199]: df['user_id'].isin(list_user_id)
Out[199]: 
0     True
1     True
2     True
3    False
4    False
5     True
6     True
7    False
8    False
9    False
Name: user_id, dtype: bool

In [200]: df[df['user_id'].isin(list_user_id)].groupby('user_id').agg(lambda x: x.tolist())
Out[200]: 
                       pos
user_id                   
1520278540  [0.0, -0.1027]
1520303294        [0.4404]
1520304915   [0.3612, 0.0]
您可以与
np.array
一起使用和:

print df
      user_id     pos
0  1520304915  0.3612
1  1520304915  0.0000
2  1520278540  0.0000
3  1520302105  0.4404
4  1520278547 -0.1531
5  1520303294  0.4404
6  1520278540 -0.1027
7  1522888020  0.9512
8  1520302847  0.7192
9  1523490451  0.8689

l = [1528106864,  1520303069, 1520305391, 1521519315, 1520303294,
     1520302954, 1520302702, 1528108709, 1520278540, 1520304915]

g = df[df.user_id.isin(l)]
print g
      user_id     pos
0  1520304915  0.3612
1  1520304915  0.0000
2  1520278540  0.0000
5  1520303294  0.4404
6  1520278540 -0.1027

print g.groupby('user_id')['pos'].apply(np.array)

user_id
1520278540    [0.0, -0.1027]
1520303294          [0.4404]
1520304915     [0.3612, 0.0]
Name: pos, dtype: object

print type(g.groupby('user_id')['pos'].apply(np.array).iloc[0])
<type 'numpy.ndarray'>
打印df
用户识别号pos
0  1520304915  0.3612
1  1520304915  0.0000
2  1520278540  0.0000
3  1520302105  0.4404
4  1520278547 -0.1531
5  1520303294  0.4404
6  1520278540 -0.1027
7  1522888020  0.9512
8  1520302847  0.7192
9  1523490451  0.8689
l=[1528106864,1520303069,1520305391,1521519315,1520303294,
1520302954, 1520302702, 1528108709, 1520278540, 1520304915]
g=df[df.user\u id.isin(l)]
打印g
用户识别号pos
0  1520304915  0.3612
1  1520304915  0.0000
2  1520278540  0.0000
5  1520303294  0.4404
6  1520278540 -0.1027
打印g.groupby('user_id')['pos'].apply(np.array)
用户id
1520278540    [0.0, -0.1027]
1520303294          [0.4404]
1520304915     [0.3612, 0.0]
名称:pos,数据类型:object
打印类型(g.groupby('user_id')['pos'].apply(np.array.iloc[0]))

由于您特别关注np阵列,以下内容满足您的要求:

In [34]:
df[df['user_id'].isin(df1['ids'])].groupby('user_id')['pos'].apply(lambda x: x.values)

Out[34]:
user_id
1520278540    [0.0, -0.1027]
1520303294          [0.4404]
1520304915     [0.3612, 0.0]
Name: pos, dtype: object
这是第一个条目:

In [36]:
df[df['user_id'].isin(df1['ids'])].groupby('user_id')['pos'].apply(lambda x: x.values).iloc[0]

Out[36]:
array([ 0.    , -0.1027])
您可以看到这是一个np数组:

In [37]:
type(df[df['user_id'].isin(df1['ids'])].groupby('user_id')['pos'].apply(lambda x: x.values).iloc[0])

Out[37]:
numpy.ndarray