Вы можете попробовать:
out = df[df.columns[0]].str.split(r"\s+")\
.apply(lambda x: pd.Series([" ".join(x[:2])] + ["{}{}".format(a, b) for a, b in zip(x[2::2], x[3::2])])) \
.rename(columns={old:new for old, new in enumerate(cols)})
Пояснения :
- После выбора единственного столбца с помощью
df[df.columns[0]]
, разделите этот столбец по всем пробелам, используя pandas.Series.str.split
. Регулярное выражение простое: \s+
: df[df.columns[0]].str.split(r"\s+")
Примените функцию custum к каждой строке, используя apply
.
- Сначала создайте заново date, объединив два первых элемента с пробелом, преобразовав их в дату и обернув ее в список:
[pd.Timestamp(" ".join(x[:2]))]
- Объедините все остальные значения 2-by2 , используя
zip
. Это обсуждение предоставляет более подробную информацию.
[float("{}{}".format(a, b)) for a, b in zip(x[2::2], x[3::2])]
- Преобразуйте этот список в
pd.Series
результат переноса из шагов 2.1 и 2.2.
Переименуйте столбцы, используя rename
. Дикт-понимание позволяет нам выполнить ожидаемый результат: .rename(columns={old:new for old, new in enumerate(cols)})
Полный код + иллюстрация
print(df)
# Date/Time Var1 Var2 Var3 Var4 Var5 Var6
# 0 17/04/2020 00:00:00 133 579.20 31 978.90 377 9...
# 1 17/04/2020 01:00:00 133 583.70 31 980.40 377 9...
# Step 1
print(df[df.columns[0]].str.split(r"\s+"))
# 0 [17/04/2020, 00:00:00, 133, 579.20, 31, 978.90...
# 1 [17/04/2020, 01:00:00, 133, 583.70, 31, 980.40...
# Name: Date/Time Var1 Var2 Var3 Var4 Var5 Var6, dtype: object
# Step 2.1
print(df[df.columns[0]].str.split(r"\s+")
.apply(lambda x: [pd.Timestamp(" ".join(x[:2]))]))
# 0 [2020-04-17 00:00:00]
# 1 [2020-04-17 01:00:00]
# Name: Date/Time Var1 Var2 Var3 Var4 Var5 Var6, dtype: object
# Step 2.2
print(df[df.columns[0]].str.split(r"\s+")
.apply(lambda x: [float("{}{}".format(a, b)) for a, b in zip(x[2::2], x[3::2])]))
# 0 [133579.2, 31978.9, 377952.81, 179412.41, 2035...
# 1 [133583.7, 31980.4, 377963.41, 179412.41, 2035...
# Name: Date/Time Var1 Var2 Var3 Var4 Var5 Var6, dtype: object
# Step 2.3
print(df[df.columns[0]].str.split(r"\s+")
.apply(lambda x: pd.Series([pd.Timestamp(" ".join(x[:2]))] + [float("{}{}".format(a, b)) for a, b in zip(x[2::2], x[3::2])])))
# 0 1 2 3 4 5 6
# 0 2020-04-17 00:00:00 133579.2 31978.9 377952.81 179412.41 203595.2 70447.4
# 1 2020-04-17 01:00:00 133583.7 31980.4 377963.41 179412.41 203595.2 70448.2
# Step 3
print(df.columns[0].split(" "))
# ['Date/Time', 'Var1', 'Var2', 'Var3', 'Var4', 'Var5', 'Var6']
out = df[df.columns[0]].str.split(r"\s+")\
.apply(lambda x: pd.Series([pd.Timestamp(" ".join(x[:2]))] + [float("{}{}".format(a, b)) for a, b in zip(x[2::2], x[3::2])])) \
.rename(columns={old: new for old, new in enumerate(df.columns[0].split(" "))})
print(out)
# Date/Time Var1 Var2 Var3 Var4 Var5 Var6
# 0 2020-04-17 00:00:00 133579.2 31978.9 377952.81 179412.41 203595.2 70447.4
# 1 2020-04-17 01:00:00 133583.7 31980.4 377963.41 179412.41 203595.2 70448.2
print(out.dtypes)
# Date/Time datetime64[ns]
# Var1 float64
# Var2 float64
# Var3 float64
# Var4 float64
# Var5 float64
# Var6 float64
# dtype: object