Как создать список уникального идентификатора из столбца в пандах, где списки идентификаторов упоминаются как строки в Python - PullRequest
0 голосов
/ 05 июля 2018

У меня есть пандас датафрейм df

import pandas as pd

lst = [23682, 21963, 9711, 21175, 13022,1662,7399, 13679, 17654,4567,23608,2828, 1234]

lst_match = ['[21963]','[21175]', '[1662 7399 13679 ]','[17654 23608]','[2828]','0','0','0','0','0','0', '0','0' ]

df = pd.DataFrame(list(zip(lst, lst_match)),columns=['ID','ID_match'])

DF

       ID            ID_match
0   23682             [21963]
1   21963             [21175]
2    9711   [1662 7399 13679]
3   21175       [17654 23608]
4   13022              [2828]
5    1662                   0
6    7399                   0
7   13679                   0
8   17654                   0
9    4567                   0
10  23608                   0
11   2828                   0
12   1234                   0

Значения в столбце ID_match также являются идентификаторами, хотя в списке в строковом формате.

Я хочу создать фрейм данных уникальных идентификаторов таким образом, чтобы мой фрейм уникальных идентификаторов содержал все идентификаторы, которые имеют некоторое значение, отличное от 0 в столбце ID_match, и те идентификаторы, которые упомянуты в столбце ID_match.

поэтому мой выходной кадр данных уникальных идентификаторов должен выглядеть следующим образом:

       ID           
0   23682            
1   21963             
2    9711  
3   21175       
4   13022              
5    1662                   
6    7399                  
7   13679                   
8   17654                   
9   23608                    
10   2828                  

Как я могу сделать это с пандами питона?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Они выглядят как строковые представления списков. Таким образом, вы можете использовать ast.literal_eval и itertools.chain:

from ast import literal_eval
from itertools import chain

s = df['ID_match'].astype(str).str.replace(' ', ',').apply(literal_eval)
L = list(chain.from_iterable(s[s != 0]))

res = pd.DataFrame({'ID': df.loc[df['ID_match'] != 0, 'ID'].tolist() + L})\
        .drop_duplicates().reset_index(drop=True)

print(res)

       ID
0   23682
1   21963
2    9711
3   21175
4   13022
5    1662
6    7399
7   13679
8   17654
9   23608
10   2828
0 голосов
/ 05 июля 2018

Использование:

s = (df[df['ID_match'] != '0']
       .set_index('ID')['ID_match']
       .str.strip('[ ]')
       .str.split('\s+', expand=True)
       .stack())
print (s)
23682  0    21963
21963  0    21175
9711   0     1662
       1     7399
       2    13679
21175  0    17654
       1    23608
13022  0     2828
dtype: object


vals = s.index.get_level_values(0).to_series().append(s.astype(int)).unique()
df = pd.DataFrame({'ID':vals})
print (df)
       ID
0   23682
1   21963
2    9711
3   21175
4   13022
5    1662
6    7399
7   13679
8   17654
9   23608
10   2828

Объяснение

  1. Сначала отфильтруйте все не 0 значения по boolean indexing
  2. Создать индекс по ID столбцу по set_index
  3. Удалить трейлинг [ ] с помощью strip
  4. split значение и изменить его на stack

  5. Затем получите первый уровень MultiIndex на get_level_values и конвертируйте to_series

  6. append Серия s преобразована в integer с
  7. Получить unique значений и последний вызов DataFrame contructor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...