python-按列对csv排序时出错

时间:2018-06-25 14:13:57

标签: python pandas

我正在尝试按多个列对.csv文件进行排序,我正在使用熊猫,这是.csv文件:

col1;col2;col3;col4;col5
6943000;11;1.0;2016-01-01 15:30:31;?
6943000;19;1.0;2016-01-01 15:38:07;?
6943000;13;1.0;2016-01-01 15:54:27;?
6942992;10;1.0;2016-01-01 00:52:59;?
6942993;8;1.0;2016-01-01 12:08:36;?
.....

我应该按col1和col4对其进行排序,这是代码:

import pandas as pd
df = pd.read_csv('input.csv')
df = df.sort_values(by=['col1', 'col4'])
df.to_csv('sorted.csv', index=False)

但我遇到此错误:

Traceback (most recent call last):   File "C:\Python\Scripts\provacsv.py", line 3, in <module>
    df = df.sort_values(by=['col1', 'col4'])   File "C:\Python\lib\site-packages\pandas\core\frame.py", line 4411, in sort_values
    stacklevel=stacklevel)   File "C:\Python\lib\site-packages\pandas\core\generic.py", line 1379, in
_get_label_or_level_values
    raise KeyError(key) KeyError: 'col1'

因此col1失败,但是我不确定这是订购第4列(时间戳记)的正确方法

1 个答案:

答案 0 :(得分:3)

您的csv以分号';'分隔,默认情况下read_csv的分隔符为',',传递参数sep=';'

In[21]:
import io
t="""col1;col2;col3;col4;col5
6943000;11;1.0;2016-01-01 15:30:31;?
6943000;19;1.0;2016-01-01 15:38:07;?
6943000;13;1.0;2016-01-01 15:54:27;?
6942992;10;1.0;2016-01-01 00:52:59;?
6942993;8;1.0;2016-01-01 12:08:36;?"""
df = pd.read_csv(io.StringIO(t), sep=';')
df = df.sort_values(by=['col1', 'col4'])
df

[21]: 
      col1  col2  col3                 col4 col5
3  6942992    10   1.0  2016-01-01 00:52:59    ?
4  6942993     8   1.0  2016-01-01 12:08:36    ?
0  6943000    11   1.0  2016-01-01 15:30:31    ?
1  6943000    19   1.0  2016-01-01 15:38:07    ?
2  6943000    13   1.0  2016-01-01 15:54:27    ?

还请注意,您的时间戳记被解释为字符串,如果您想datetime dtype然后告诉pandas解析它们:

In[26]:

import io
t="""col1;col2;col3;col4;col5
6943000;11;1.0;2016-01-01 15:30:31;?
6943000;19;1.0;2016-01-01 15:38:07;?
6943000;13;1.0;2016-01-01 15:54:27;?
6942992;10;1.0;2016-01-01 00:52:59;?
6942993;8;1.0;2016-01-01 12:08:36;?"""
df = pd.read_csv(io.StringIO(t), sep=';', parse_dates=['col4'])
df = df.sort_values(by=['col1', 'col4'])
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 5 entries, 3 to 2
Data columns (total 5 columns):
col1    5 non-null int64
col2    5 non-null int64
col3    5 non-null float64
col4    5 non-null datetime64[ns]
col5    5 non-null object
dtypes: datetime64[ns](1), float64(1), int64(2), object(1)
memory usage: 240.0+ bytes