在熊猫中从修改后的csv加载数据集

时间:2018-09-25 14:16:16

标签: python pandas csv

我有一个数据文件,数据的存储方式如下:

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)

3 个答案:

答案 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)