为了账号安全,请及时绑定邮箱和手机立即绑定

使用 re.compile().split() 遍历数据帧行

使用 re.compile().split() 遍历数据帧行

月关宝盒 2022-11-18 16:38:35
我有一个由 1 列和几行组成的数据框。这些行中的每一行都以相同的方式构造:-timestamp- value1 value2 value3 -timestamp- value 4 value5 value6 ...时间戳具有以下格式:YYYY-MM-DD HH:MM:SS值是带 2 位小数的数字。我想制作一个新的数据框,其中一行有单独的时间戳,下一行有相关值。我设法使用正则表达式按行获得预期结果,但不是针对整个数据框。到目前为止我的代码:#input dataframedata.head()                  values0   2020-05-12 10:00:00 12.07 13 11.56 ... 2020-05-12 10:00:01 11.49 17 5.67...1   2020-05-12 10:01:00 11.49 17 5.67 ... 2020-05-12 10:01:01 12.07 13 11.56...2   2020-05-12 10:02:00 14.29 18 11.28 ... 2020-05-12 10:02:01 13.77 18 7.43...test = data['values'].iloc[0] #first row of datarow1 = re.compile("(\d\d\d\d\S\d\d\S\d\d\s\d\d\S\d\d\S\d\d)").split(test)df_row1 = pd.DataFrame(row1)df_row1.head()             values 0   2020-05-12 10:00:001   12.07 13.79 15.45 17.17 18.91 14.91 12.35 14....2   2020-05-12 10:00:013   12.48 13.96 13.88 15.57 18.46 15.0 13.65 14.6...#trying the same for the entire dataframe for row in data:    df_new = re.compile("(\d\d\d\d\S\d\d\S\d\d\s\d\d\S\d\d\S\d\d)").split(row)print(df_new)['values']我现在的问题是如何循环遍历数据框的行并获得预期的结果?
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

如果您想首先拆分行并将值提取到列中,请注意您可以使用str.extract. 在您的正则表达式中使用命名分组,它将自动为您的数据框分配列


split_line = r"\s+(?=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})"

extract_values = r"(?P<date>\d{4}-\d{2}-\d{2})\s(?P<time>\d{2}:\d{2}:\d{2})\s(?P<value_one>.*?)\s(?P<value_two>.*?)\s(?P<value_three>.*?)$"


df = pd.DataFrame([{

    "value": "2020-05-12 10:00:00 12.07 13 11.56 2020-06-12 11:00:00 13.07 16 11.16 2020-05-12 10:00:01 11.49 17 5.67", 

},{

    "value": "2020-05-13 10:00:00 14.07 13 15.56 2020-05-16 10:00:02 11.51 18 5.69", 

}])

df = df["value"].str.split(split_line).explode().str.extract(extract_values, expand=True)

print(df)

#          date      time value_one value_two value_three

# 0  2020-05-12  10:00:00     12.07        13       11.56

# 0  2020-06-12  11:00:00     13.07        16       11.16

# 0  2020-05-12  10:00:01     11.49        17        5.67

# 1  2020-05-13  10:00:00     14.07        13       15.56

# 1  2020-05-16  10:00:02     11.51        18        5.69

如果您不知道日期和时间后的组数,请使用split而不是正则表达式。我会建议这样的事情:


split_line = r"\s+(?=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})"


df = pd.DataFrame([{

    "value": "2020-05-12 10:00:00 12.07 13 11.56 2020-06-12 11:00:00 13.07 16 11.16 2020-05-12 10:00:01 11.49 17 5.67", 

},{

    "value": "2020-05-13 10:00:00 14.07 13 14 15 15.56 2020-05-16 10:00:02 11.51 18 5.69", 

}])

df = df["value"].str.split(split_line).explode().reset_index()


df = df['value'].str.split(" ").apply(pd.Series)

df.columns = [f"col_{col}" for col in df.columns]

print(df)

#         col_0     col_1  col_2 col_3  col_4 col_5  col_6

# 0  2020-05-12  10:00:00  12.07    13  11.56   NaN    NaN

# 1  2020-06-12  11:00:00  13.07    16  11.16   NaN    NaN

# 2  2020-05-12  10:00:01  11.49    17   5.67   NaN    NaN

# 3  2020-05-13  10:00:00  14.07    13     14    15  15.56

# 4  2020-05-16  10:00:02  11.51    18   5.69   NaN    NaN


查看完整回答
反对 回复 2022-11-18
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号