我有一些csv文件,包括数组列。例如:
a,b,c
1,1|2|3,4.5|5.5|6.5
2,7|8|9,10.5|11.5|12.5
Delimiter 1是,
,用于分隔字段a、b和c。在这种情况下,Delimiter 2是|
,但可以更改。
python中是否有可能直接将其作为pandas数据帧读取?字段b和c应该是数据帧中的一个数组/序列。
我现在所做的是将csv读取为字符串:
df = pd.read_csv('data.csv', dtype='str')
然后使用np.fromstring
将所有字符串转换为numpy数组:
type_dict = {
"a": "int",
"b": "int",
"c": "float"
}
def make_split(text, dt):
return np.fromstring(text, sep="|", dtype=dt)
df = df.apply(lambda x: x.apply(make_split, dt=type_dict[x.name]))
但我的文件需要几分钟时间。有没有更快的选择?
您可以使用.read_csv()
的converters
参数来解析列:
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv', converters={
'b': lambda x: np.array(x.split('|'), dtype='int'),
'c': lambda x: np.array(x.split('|'), dtype='float')
})
print(df)
输出:
a b c
0 1 [1, 2, 3] [4.5, 5.5, 6.5]
1 2 [7, 8, 9] [10.5, 11.5, 12.5]
df=pd.read_csv(r'csv2.txt', sep=',')
df['b']=df['b'].str.split('|').apply(lambda x: [int(i) for i in x])
df['c']=df['c'].str.split('|').apply(lambda x: [float(i) for i in x])
df
a b c
0 1 [1, 2, 3] [4.5, 5.5, 6.5]
1 2 [7, 8, 9] [10.5, 11.5, 12.5]