2016-01-18 55 views
2

我有一個DataFrame,包含6676行和40列。這是兩個感興趣的列的截斷版本。熊貓:迭代地從DataFrame中提取Numpy陣列

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 

欲反覆提取所述的POS「值的各個numpy的陣列爲每個「USER_ID」如果「USER_ID」是存在於列表中。這應該返回10個單獨的數組。

由於DataFrame中存在可變的user_id,因此數組的長度可能不同。

下面是數組看起來像從上面的截斷數據中得出的兩個例子......這主要是基於上述值的可視化輔助,我可以看到。

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

回答

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 
1

你可以使用isin方法與list_user_id到子集的數據幀。你user_id柱和aggtolist然後grouby轉換變量列表:

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

您可以使用isingroupbyapplynp.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'>