Как я могу установить строку во фрейме данных Pandas в одинаковом положении во всех строках? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь разбить строку для создания иерархии цен за клик, используя панд.Вот мой фрейм данных df_all_new_p

                     CPC   
        0   Y10T403/4602        
        1     H02S20/00     
        2   H01L31/02168        

Я собираюсь сделать 6-10 уровней CPC с условием, что Lv.1 содержит одну букву, Lv2 содержит две буквы, Lv3 содержит 2-3например, буквы и 4,5,5,7,8 .. являются буквой после '/'

.

Y10T403/4602 -> Y, 10,  T, 403, 43/4, 43/46, 43/460, 43/4602
H02S20/00 ->  H, 02, S, 20, 20/0,   20/00
H01L31/02168->  H, 01,  L, 31, 31/0, 31/02, 31/021, 31/0216, 31/02168 

, но когда я запускаю свой код, который

if df_all_new_p['CPC'].map(lambda x: x[0:7]).str.contains('/').any():
    df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
    df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
    df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
    df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:6])
    df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[4:8])
    df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[4:9])

elif df_all_new_p['CPC'].map(lambda x: x[0:8]).str.contains('/').any():
    df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
    df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
    df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
    df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:7])
    df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[7:9])
    df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[7:10])

else:

    df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
    df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
    df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
    df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:8])
    df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[8:10])
    df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[8:11])


df_all_new_p


                 CPC   Lv1 Lv2 Lv3 Lv4  Lv5    Lv6
    0   Y10T403/4602        Y1  0   T4  03     4602
    1     H02S20/00     H   02  S   20  20/0   20/00
    2   H01L31/02168        H0  1   L3  1/     02168

Результат показывает, что только 1 H02S20/00 получил правильный ответ, а другие строки получили неправильные результаты.Я предположил, что причина произошла по позиции персонажа в каждой строке.Поэтому мне интересно, есть ли способы решить эту проблему?

Я ожидаю увидеть такой результат.

         CPC    1  2  3   4  5       6      
 Y10T403/4602   Y 10  T 403 43/4 43/46 
    H02S20/00   H 02  S 20  20/0 20/00
  H01L31/02168  H 01  L 31  31/0 31/02 

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вот еще один потенциальный подход, использующий шаблоны regex с Series.extract и pandas.concat в пользовательской функции:

def cpc_hierarchy(cpc_series):
    pat1 = '(.)(\d{2})(.)(\d{2,3})'
    pat2 = '(\d{2}\/\d{1})'
    pat3 = '(\d{2}\/\d{2})'

    expanded = (pd.concat([
        cpc_series.to_frame(),
        cpc_series.str.extract(pat1),
        cpc_series.str.extract(pat2),
        cpc_series.str.extract(pat3)],
        ignore_index=True,
        axis=1).set_index(0).rename_axis('CPC', 0))
    return  expanded

print(cpc_hierarchy(df['CPC'])) 

              1   2  3    4     5      6
CPC                                     
Y10T403/4602  Y  10  T  403  03/4  03/46
H02S20/00     H  02  S   20  20/0  20/00
H01L31/02168  H  01  L   31  31/0  31/02
0 голосов
/ 17 декабря 2018

Предисловие, сказав, что, возможно, есть более эффективные способы сделать это.Тем не менее, вы можете использовать str.find ('/'), чтобы помочь с индексированием:

df=pd.DataFrame({'a':[1,2,3],'CPC':['Y10T403/4602','H02S20/00','H01L31/02168']})


    a   CPC
0   1   Y10T403/4602
1   2   H02S20/00
2   3   H01L31/02168

[i[i.find('/')-2:i.find('/')+3] for i in df['CPC']]

['03/46', '20/00', '31/02']

Таким образом, вы можете определить функцию для передачи df.apply()

def parse_cpc(val):
    elems=[]
    elems.append(val[0])
    elems.append(val[1:3])
    elems.append(val[3])
    elems.append(val[4:val.find('/')])
    elems.append(val[val.find('/')-2:val.find('/')+2])
    elems.append(val[val.find('/')-2:val.find('/')+3])
    return elems

и примените его, затем разбейте столбец на несколько столбцов (* -редактировано для удаления ненужной лямбды)

df['p']=df['CPC'].apply(parse_cpc)*

    a   CPC p
0   1   Y10T403/4602    [Y, 10, T, 403, 03/4, 03/46]
1   2   H02S20/00   [H, 02, S, 20, 20/0, 20/00]
2   3   H01L31/02168    [H, 01, L, 31, 31/0, 31/02]

df[[1,2,3,4,5,6]]=pd.DataFrame(df['p'].values.tolist())

    a   CPC             p                               1   2   3   4   5       6
0   1   Y10T403/4602    [Y, 10, T, 403, 03/4, 03/46]    Y   10  T   403 03/4    03/46
1   2   H02S20/00       [H, 02, S, 20, 20/0, 20/00]     H   02  S   20  20/0    20/00
2   3   H01L31/02168    [H, 01, L, 31, 31/0, 31/02]     H   01  L   31  31/0    31/02

Затем опустите столбец перехода

df.drop('p', axis=1, inplace=True)

    a   CPC             1   2   3   4   5       6
0   1   Y10T403/4602    Y   10  T   403 03/4    03/46
1   2   H02S20/00       H   02  S   20  20/0    20/00
2   3   H01L31/02168    H   01  L   31  31/0    31/02
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...