熊猫:迭代地从DataFrame中提取Numpy数组

时间:2016-01-18 12:30:33

标签: python numpy pandas

我有一个包含6676行和40列的DataFrame。这是两列感兴趣的截断版本。

    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

我还有一个单独的user_id列表。

0    1528106864
1    1520303069
2    1520305391
3    1521519315
4    1520303294
5    1520302954
6    1520302702
7    1528108709
8    1520278540
9    1520304915

如果列表中存在'user_id',我想迭代地为每个'user_id'的'pos'值提取单个numpy数组。这应该返回10个单独的数组。

由于DataFrame中存在变量user_id,因此数组的长度会有所不同。

以下是从上面的截断数据中得出的数组的两个示例...这主要是基于上面我可以看到的值的可视化辅助工具。

1520304915:([0.3612, 0.0000, ...
1520278540:([0.0000, -0.1027, ...

3 个答案:

答案 0 :(得分:1)

您可以使用isin方法将数据框与您的list_user_id进行对。然后user_idgroubyagg 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] 将变量转换为列表:

Error report:

答案 1 :(得分:1)

您可以将isingroupbyapply 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'>

答案 2 :(得分:1)

正如你专门在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