用两个分隔符将CSV导入pandas

2024-10-01 11:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV,有两个分隔符(;)和(,),它看起来像这样:

vin;vorgangid;eventkm;D_8_lamsoni_w_time;D_8_lamsoni_w_value
V345578;295234545;13;-1000.0,-980.0;7.9921875,11.984375
V346670;329781064;13;-960.0,-940.0;7.9921875,11.984375

我想将它导入到pandas数据框中,其中(;)充当列分隔符,(,)作为list或{}的分隔符,使用float作为数据类型。到目前为止,我使用的是这种方法,但我相信还有更简单的方法。在

^{pr2}$

Tags: csv数据方法pandastimevaluefloatlist
3条回答

从这里的其他更好的答案来看,更具体的是pandas,需要注意的是,Python本身在字符串处理方面非常强大。您只需将';'替换为','的结果放在^{}对象中,然后从那里正常工作:

In [8]: import pandas as pd

In [9]: from cStringIO import StringIO

In [10]: pd.read_csv(StringIO(''.join(l.replace(';', ',') for l in open('stuff.csv'))))
Out[10]: 
                   vin  vorgangid  eventkm  D_8_lamsoni_w_time  \
V345578 295234545   13    -1000.0   -980.0            7.992188   
V346670 329781064   13     -960.0   -940.0            7.992188   

                   D_8_lamsoni_w_value  
V345578 295234545            11.984375  
V346670 329781064            11.984375  

首先使用;作为分隔符读取CSV:

df = pd.read_csv(filename, sep=';')

更新:

^{pr2}$

旧答案:

现在,我们可以将数字拆分为“数字”列中的列表:

In [20]: df[['D_8_lamsoni_w_time',  'D_8_lamsoni_w_value']] = \
    df[['D_8_lamsoni_w_time',  'D_8_lamsoni_w_value']].apply(lambda x: x.str.split(','))
In [21]: df
Out[21]:
       vin  vorgangid  eventkm D_8_lamsoni_w_time     D_8_lamsoni_w_value
0  V345578  295234545       13  [-1000.0, -980.0]  [7.9921875, 11.984375]
1  V346670  329781064       13   [-960.0, -940.0]  [7.9921875, 11.984375]

您可以在^{}中使用参数converters,并定义用于拆分的自定义函数:

def f(x):
    return [float(i) for i in x.split(',')]

#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp), 
                 sep=";", 
                 converters={'D_8_lamsoni_w_time':f, 'D_8_lamsoni_w_value':f})
print (df)
       vin  vorgangid  eventkm D_8_lamsoni_w_time     D_8_lamsoni_w_value
0  V345578  295234545       13  [-1000.0, -980.0]  [7.9921875, 11.984375]
1  V346670  329781064       13   [-960.0, -940.0]  [7.9921875, 11.984375]

另一个在4.5.列中使用NaN的解决方案:

您可以将^{}与分隔符;一起使用,然后将^{}应用于^{}选择的{cd4>}和{}列,并将list中的每个值转换为float

^{pr2}$

如果需要numpy arrays而不是{}:

#split 4.th and 5th column and convert to numpy array
df.iloc[:,3] = df.iloc[:,3].str.split(',').apply(lambda x: np.array([float(i) for i in x]))
df.iloc[:,4] = df.iloc[:,4].str.split(',').apply(lambda x: np.array([float(i) for i in x]))
print (df)
       vin  vorgangid  eventkm D_8_lamsoni_w_time     D_8_lamsoni_w_value
0  V345578  295234545       13  [-1000.0, -980.0]  [7.9921875, 11.984375]
1  V346670  329781064       13   [-960.0, -940.0]  [7.9921875, 11.984375]

print (type(df.iloc[0,3]))
<class 'numpy.ndarray'>

我试着改进你的解决方案:

a=0;
csv_import=pd.read_csv(folder+FileName, ';')
for col in csv_import.columns:
    a += 1
    if type(csv_import.ix[0, col])== str and a>3:
        # string to list of strings
        csv_import[col]=csv_import[col].apply(lambda x: [float(y) for y in x.split(',')])

相关问题 更多 >