熊猫:在所有数据中从字符串中间开始的每两个字符中添加一个冒号

时间:2018-11-05 01:04:14

标签: 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。

最Python简洁的方法是什么?

编辑:这是我用来尝试获得所需输出的代码。

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 :(得分:0)

定义您自己的函数并将此处的时间转换为时间格式,我不使用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

答案 1 :(得分:0)

使用正则表达式将星号(最后一个除外)之后的每一对数字替换为同一对数字和一个冒号:

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

"(?!$)"被称为负向超前,意思是“除了最后一个。”