我有一个数据文件,数据的存储方式如下:
key1:0.2164 key2:0.321 key3:0.1231
key1:0.3216 key2:0.149 key3:0.7894
...
因此,基本上,列名是作为某种键编写的。行由文本文件中的新行分隔。没有昏迷。
我想将其转换为columns=[key1,key2,key3]
显然,仅使用pd.read_csv(...,sep=':')
是不够的,因为我最终在每个单元格中都使用了key1:0.1231
之类的值,而该单元格应该是0.1231
。
我不确定是否应该使用特殊的正则表达式作为分隔符,还是应该使用其他方法加载文件(因为它不是真正的.csv)
答案 0 :(得分:1)
在数据进入数据帧之前执行操作通常会更高效。这是使用csv
模块的示例:
import pandas as pd
import csv
from io import StringIO
x = StringIO("""key1:0.2164 key2:0.321 key3:0.1231
key1:0.3216 key2:0.149 key3:0.7894 """)
# replace x with 'file.csv'
with x as fin:
reader = csv.reader(fin, delimiter=' ')
df = pd.DataFrame([dict(i.split(':') for i in filter(None, row)) for row in reader],
dtype=float)
结果:
key1 key2 key3
0 0.2164 0.321 0.1231
1 0.3216 0.149 0.7894
该逻辑之所以起作用,是因为pd.DataFrame
构造函数接受字典列表作为输入。
答案 1 :(得分:1)
您可以使用转换器读取文件。方法如下:
df %>%
group_by(ID) %>%
mutate(New.DateTime = max(Datetime[ToolID == "CCP_B" & Step == "Step_B"]))
# A tibble: 8 x 5
# Groups: ID [2]
# ID ToolID Step Datetime New.DateTime
# <fct> <fct> <fct> <dttm> <dttm>
#1 111 CCP_A Step_A 2018-04-19 12:44:11 2018-04-17 12:44:11
#2 111 CCP_B Step_B 2018-04-17 12:44:11 2018-04-17 12:44:11
#3 111 CCP_B Step_B 2018-04-17 12:44:11 2018-04-17 12:44:11
#4 111 CCQ_A Step_C 2018-04-16 21:11:09 2018-04-17 12:44:11
#5 113 CCP_A Step_A 2018-04-13 12:44:11 2018-04-11 12:44:11
#6 113 CCP_B Step_B 2018-04-11 12:44:11 2018-04-11 12:44:11
#7 113 CCP_B Step_B 2018-04-11 12:44:11 2018-04-11 12:44:11
#8 113 CCQ_A Step_C 2018-04-10 21:11:09 2018-04-11 12:44:11
# read the columns names by loading one line and inferring the names from it
columns = pd.read_csv("filename", nrows=1, header=None,
sep="\s+").values.tolist()[0]
columns = [c.split(":")[0] for c in columns]
# prepare the converters
converters = {idx: lambda x: x.split(":")[1] for idx, _ in enumerate(columns)}
# read the whole file
df = pd.read_csv("filename", header=None, names=columns, sep="\s+",
converters=converters)
您可以在pd.read_csv的文档中找到有关转换器的更多信息
答案 2 :(得分:0)
还有另一种方法:
df = pd.read_csv('filename',sep='\s+', names=['key1','key2','key3'])
for col in df.columns:
df[col] = df[col].str.split(':').str[1].astype(float)