pandas数据帧格式来自具有多个标识符的元素

时间:2015-07-01 23:37:10

标签: python pandas

我有一个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的最佳方法。

谢谢!

2 个答案:

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