2016-01-18 4 views
2

У меня есть DataFrame с 6676 строками и 40 столбцами. Это усеченная версия двух интересующих столбцов.Pandas: Итеративно Извлечь массивы массивов из 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 

Я хочу итеративно извлекать отдельные Numpy массивы для значений по «POS» для каждого «user_id» если «user_id» присутствует в списке. Это должно возвращать 10 отдельных массивов.

Массивы будут различной длины, так как в DataFrame есть переменные user_id.

Вот два примера того, как массивы будут выглядеть как вычерченные из усеченных данных выше ... это в основном просто средство визуализации, основанное на значениях выше, которые я вижу.

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

ответ

1

Как вы особенно после ир массивов, то нижеследующий делает, чего вы хотите:

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

Вы можете увидеть это нп массив:

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 метод подмножество вашего dataframe с list_user_id. Затем grouby ваша user_id колонки и agg с tolist для преобразования переменных в список:

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

Вы можете использовать isin и groupby с applynp.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'> 
Смежные вопросы