使用Pandas加载CSV并拆分嵌套逗号分隔列的技术问询
如何用Pandas加载CSV并拆分十六进制数据列
问题背景
我有这样的样本CSV数据:
2017-11-27T00:29:37.698-06:00,"42,00,00,00,3E,51,1B,D7,42,1C,00,00,40" 2017-11-27T00:29:37.698-06:00,"42,00,00,00,3E,51,1B,D7,42,1C,00,00,40" 2017-11-27T00:29:37.698-06:00,"42,00,00,00,3E,51,1B,D7,42,1C,00,00,40"
一开始用pd.read_csv("sample.csv", header=None)加载后,数据被错误拆分出了空列,且第三列的十六进制串是整体的:
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 2017-11-27T00:29:37.698-06:00 | NaN | 42,00,00,00,3E,51,1B,D7,42,1C,00,00,40 |
| 1 | 2017-11-27T00:29:37.698-06:00 | NaN | 42,00,00,00,3E,51,1B,D7,42,1C,00,00,40 |
| 2 | 2017-11-27T00:29:37.698-06:00 | NaN | 42,00,00,00,3E,51,1B,D7,42,1C,00,00,40 |
我需要保留第一列的时间戳,同时把第三列的十六进制数据拆分成单独的列,最终得到这样的结构:
| 0 | 1 | 2 | 3 | 4 | ... | |
|---|---|---|---|---|---|---|
| 0 | 2017-11-27T00:29:37.698-06:00 | 42 | 00 | 00 | 00 | ... |
| 1 | 2017-11-27T00:29:37.698-06:00 | 42 | 00 | 00 | 00 | ... |
| 2 | 2017-11-27T00:29:37.698-06:00 | 42 | 00 | 00 | 00 | ... |
解决方案
问题根源是CSV里的十六进制串被引号包裹,默认的read_csv没有识别引号内的逗号是字段内部分隔符,导致错误拆分。这里提供两种可行的处理方式:
方法1:加载时直接处理(更高效)
在加载数据时指定quotechar='"',让Pandas识别引号内的内容为单个字段,再拆分十六进制列:
import pandas as pd # 加载数据,指定引号字符避免内部逗号被错误拆分 df = pd.read_csv("sample.csv", header=None, quotechar='"') # 拆分第三列(索引为2)的逗号分隔数据,生成新的DataFrame hex_columns = df[2].str.split(',', expand=True) # 合并时间戳列和拆分后的十六进制列 final_df = pd.concat([df[0], hex_columns], axis=1) # 可选:给列重命名,方便后续使用 final_df.columns = ['timestamp'] + [f'hex_{i}' for i in range(hex_columns.shape[1])] print(final_df.head())
方法2:先加载再清理(适合已加载数据的场景)
如果已经加载了带有空列的数据,可以先删除空列再拆分:
import pandas as pd # 原来的加载方式 df = pd.read_csv("sample.csv", header=None) # 删除空的第二列(索引1) clean_df = df.drop(columns=1) # 拆分原第三列(现在是索引1) hex_columns = clean_df[1].str.split(',', expand=True) # 合并时间戳和拆分后的列 final_df = pd.concat([clean_df[0], hex_columns], axis=1) print(final_df.head())
两种方法都能实现需求,第一种从加载阶段就避免了错误拆分,更推荐使用。
内容的提问来源于stack exchange,提问作者gokyori
相关产品推荐
相关产品推荐

