我有一个CSV文件,格式如下。想象一下,白色空格是逗号分隔的。
slot0 slot1
Serial Timestamp Height Width Score Height Width Score ....
FA125 2015_05 215.00 125.01 156.02 235.23 862.23 135.52 ....
对于许多使用此模式的插槽#,会继续进行数千行和重复操作。插槽#与其居中的“高度,宽度和分数”相关联。也就是说,slot0对应于第一个高度,宽度和分数,slot1对应于第二个高度,宽度和分数。每个插槽都有三个测量值。
我无法找到将此数据粘贴到pandas.DataFrame中的最佳方法,其中我将插槽编号与特定高度,宽度和分数相关联,尤其是串行或时间戳。
我想到的一件事是这样的,但是如果我能做得更好就不那么明确了。
Serial Timestamp s0_Height s0_Width s0_Score s1_Height s1_Width s1_score ....
FA125 2015_05 215.00 125.01 156.02 235.23 862.23 135.52 ....
这种形式似乎有点尴尬,但如果这是我认为我可以管理的唯一方式。
# Maybe something like this?
pd.DataFrame({'FSJ1503007N-ct0': ['20150311_021738', 140, 123, 213]}, ['timestamp', 's0_height', 's0_score', 's0_width'])
请记住,我可以通过任何方式调整CSV来实例化DataFrame,但问题是我不确定用这些数据创建DataFrame的最佳方法。
谢谢!
答案 0 :(得分:1)
这实际上取决于您希望对数据进行何种计算。
如果您只是跳过第一行,您的csv将被读入:
Serial Timestamp Height Width Score Height.1 Width.1 Score.1 ....
0 FA125 2015_05 215 125.01 156.02 235.23 862.23 135.52 ....
这可能足以满足您的需求。
答案 1 :(得分:1)
import pandas as pd
import numpy as np
# just to create a string buffer, you don't need this if you have csv file
from io import StringIO
# replicate your csv file structure
line1 = ','.join(['slot' + str(x) for x in range(3)]) + '\n'
line2 = 'Serial,Timestamp,' + ','.join(['Height', 'Width', 'Score']*3) + '\n'
np.random.seed(0)
data = np.random.randint(100, 1000, size=9)
line3 = 'FA125,2015_5,'+','.join([str(x) for x in data]) + '\n'
csv_buffer = line1+line2+line3
Out[40]: 'slot0,slot1,slot2\nSerial,Timestamp,Height,Width,Score,Height,Width,Score,Height,Width,Score\nFA125,2015_5,784,659,729,292,935,863,807,459,109\n'
# read your file, set the first 2 columns as index, the rest using multi-level column index
level1 = ['slot'+str(x) for x in range(3)]
level2 = ['Height', 'Width', 'Score']
multi_level_columns = pd.MultiIndex.from_product([level1, level2])
df = pd.read_csv(StringIO(csv_buffer), index_col=[0,1], skiprows=[0], header=0)
df.columns = multi_level_columns
Out[62]:
slot0 slot1 slot2
Height Width Score Height Width Score Height Width Score
Serial Timestamp
FA125 2015_5 784 659 729 292 935 863 807 459 109
# you can reshape the original df
df.stack(level=0)
Out[63]:
Height Score Width
Serial Timestamp
FA125 2015_5 slot0 784 729 659
slot1 292 863 935
slot2 807 109 459