Как вырезать строку, основанную на цифре, сначала определенная цифра, а остальные - PullRequest
6 голосов
/ 10 июля 2019

Как мне вырезать строку, основанную на цифре: первая определенная цифра и остальные

Вот мои данные

Id       actual_pattern
1                100101
2                 10101
3               1010101
4                   101

Вот ожидаемый результат

для cut_pattern1это первые 4 цифры из actual_pattern для cut_pattern2 это форма остатка из cut_pattern1, если остаток из cut_pattern1 не существует, введите cut_pattern2 = 0

Если есть 1 вcut_pattern2, сделать binary_cut2 = 1, еще сделать binary_cut2 = 0

Id       actual_pattern   cut_pattern1       cut_pattern2    binary_cut2
1                100101           1001                 01              1
2                 10101           1010                  1              1
3               1010101           1010                101              1
4                   101            101                  0              0

Ответы [ 3 ]

5 голосов
/ 10 июля 2019

Создание новых столбцов путем индексации с помощью str, replace для изменения пустых строк и для использования нового столбца Series.str.contains с приведением к целым числам:

df['actual_pattern'] = df['actual_pattern'].astype(str)

df['cut_pattern1'] = df['actual_pattern'].str[:4]
df['cut_pattern2'] = df['actual_pattern'].str[4:].replace('','0')
df['binary_cut2'] = df['cut_pattern2'].str.contains('1').astype(int)
print (df)
   Id actual_pattern cut_pattern1 cut_pattern2  binary_cut2
0   1         100101         1001           01            1
1   2          10101         1010            1            1
2   3        1010101         1010          101            1
3   4            101          101            0            0

EDIT:

Решение для @Rick Hitchcock из комментариев:

df['actual_pattern'] = df['actual_pattern'].astype(str)

df['cut_pattern1'] = df['actual_pattern'].str[:4]
df['cut_pattern2'] = df['actual_pattern'].str[4:].replace('','0')
df['binary_cut2'] = df['cut_pattern2'].str.contains('1').astype(int)
print (df)
  Id actual_pattern cut_pattern1 cut_pattern2  binary_cut2
0  1         100101         1001           01            1
1  2          10101         1010            1            1
2  3        1010101         1010          101            1
3  4       00001111         0000         1111            1
3 голосов
/ 10 июля 2019

Вот как я подхожу к этому:

s = df.actual_pattern.astype(str).str
# Split into 2 lists, the first containing the first 4 digits
out = s.split(r'(\d{4})').str[-2:].values.tolist()
# [['1001', '01'], ['1010', '1'], ['1010', '101'], ['101']]
# build a dataframe from the lists
out = pd.DataFrame(out, columns=['cut_pattern1', 'cut_pattern2'])
# fill missing values (absense of string in list) with 0
out['cut_pattern2'] = out.cut_pattern2.fillna('0')
out['binary_cut2'] = out.cut_pattern2.str.contains('1').view('i1')
print(out)

     cut_pattern1 cut_pattern2 binary_cut2
0         1001           01           1
1         1010            1           1
2         1010          101           1
3          101            0           0
2 голосов
/ 10 июля 2019

Использование некоторого регулярного выражения и извлечения строки здесь:

m=df.actual_pattern.str.extract('(?P<cut_pattern1>.{,4})(?P<cut_pattern2>.*)').replace('',0)

   cut_pattern1 cut_pattern2
0         1001           01
1         1010            1
2         1010          101
3          101            0

Затем выполните:

m.assign(binary_cut2=m.cut_pattern2.str.contains('1',na=False).astype(int))

  cut_pattern1 cut_pattern2  binary_cut2
0         1001           01            1
1         1010            1            1
2         1010          101            1
3          101            0            0

Наконец, согласуйте это с оригинальным df:

m=df.actual_pattern.str.extract('(?P<cut_pattern1>.{,4})(?P<cut_pattern2>.*)').replace('',0)
m=m.assign(binary_cut2=m.cut_pattern2.str.contains('1',na=False).astype(int))
pd.concat([df,m],axis=1)

  Id actual_pattern cut_pattern1 cut_pattern2  binary_cut2
0  1         100101         1001           01            1
1  2          10101         1010            1            1
2  3        1010101         1010          101            1
3  4            101          101            0            0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...