Панды: добавление двоеточия к каждые два символа, начиная с середины строки во всех данных - PullRequest
0 голосов
/ 05 ноября 2018

Мои данные представляют собой фрейм данных Pandas и выглядят так:

ALB_1ABCD2_1  ABCD3_1  AB_1  AB_2
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062 
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062
ALB*000051  ABCB4*000050  ADH4*000131  ALB*000062

Начиная с *, я хотел бы добавить двоеточия между каждыми двумя символами (числами). Поэтому я хочу, чтобы все данные выглядели как ALB * 00: 00: 51 или ABCB4 * 00: 00: 50.

Какой самый питонический и лаконичный способ сделать это?

Редактировать: это код, который я использовал, чтобы получить желаемый результат.

for column in df_new3.columns[2:]:
df_new3[column] = df_new3[column].str.replace("+","*")
for data_str in df_new3[column]:
    start_loc = data_str.find('*') + 1
    former_half = data_str[:start_loc]
    latter_half = ":".join(data_str[i:i+2] for i in range(start_loc, len(data_str), 2))
    full = former_half + latter_half
    data_str = full
    print(full)

Кажется, я не могу заставить работать строку "data_str = full" - print (full), похоже, возвращает данные в нужном мне формате, но я бы хотел, чтобы значения в кадре данных были заменены на недавно отформатированный ценности.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Используйте регулярное выражение для замены каждой пары цифр после звездочки (кроме последней) на ту же пару цифр и двоеточие:

for col in df:
    df[col] = df[col].str.replace(r"\\*(\d{2}(?!$))", r"\1:")

#   ALB_1ABCD2_1         ABCD3_1           AB_1          AB_2
#0  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*00:00:62
#1  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*00:00:62

"(?!$)" называется отрицательный прогноз и означает «За исключением последнего».

0 голосов
/ 05 ноября 2018

Определите свою собственную функцию и преобразуйте время здесь в формат времени, я не использую apply, так как у вас есть некоторые поврежденные данные, такие как 000062

def yourfunc(x):
    x=x.str.split('*',expand=True)
    x[1]=pd.to_datetime(x[1],format='%H%M%S').dt.strftime('%H:%M:%S')
    return x.apply('*'.join,1)

for x in df:
df[x]=yourfunc(df[x])


df
Out[308]: 
   ALB_1ABCD2_1         ABCD3_1           AB_1        AB_2
0  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
1  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
2  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
3  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
4  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
5  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
6  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
7  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
8  ALB*00:00:51  ABCB4*00:00:50  ADH4*00:01:31  ALB*000062
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...