Pandas弄乱了DataFrame.from_csv上的日期列

时间:2015-07-21 10:15:35

标签: python date csv pandas

我使用Python 3.4.0和pandas == 0.16.2。我的足球队成绩为CSV文件,其中包含以下列:date,at,goals.scored,goals.lost,result。 ' at'列可以具有三个值(H,A,N)中的一个,其指示游戏是否分别在团队的主场,远离或中立位置发生。这是一个这样的文件的负责人:

date,at,goals.scored,goals.lost,result
16/09/2014,A,0,2,2
01/10/2014,H,4,1,1
22/10/2014,A,2,1,1
04/11/2014,H,3,3,0
26/11/2014,H,2,0,1
09/12/2014,A,4,1,1
25/02/2015,H,1,3,2
17/03/2015,A,2,0,1
19/08/2014,A,0,0,0

当我以通常的方式将此文件加载到pandas.DataFrame时:

import pandas as pd
aTeam = pd.DataFrame.from_csv("teamA-results.csv")

前两列' date'并且' at'似乎被视为一个,我得到一个像这样的格式错误的数据框架:

aTeam.dtypes

at              object
goals.scored     int64
goals.lost       int64
result           int64
dtype: object

aTeam

    at  goals.scored    goals.lost  result
date                
2014-09-16  A   0   2   2
2014-01-10  H   4   1   1
2014-10-22  A   2   1   1
2014-04-11  H   3   3   0
2014-11-26  H   2   0   1
...

代码块没有明确反映出损坏,所以我附上了Jupyter笔记本的屏幕截图:

date+at columns corruption after csv_read

你可以看到' date'并且' at'列似乎被视为对象类型的一列:

aTeam['at']

date
2014-09-16    A
2014-01-10    H
2014-10-22    A
2014-04-11    H
2014-11-26    H
2014-09-12    A

最初我认为日期周围缺少引号导致了这个问题,所以我添加了这些,但它根本没有帮助,所以我引用了' at'中的所有值。列仍然没有解决问题。我在CSV文件中尝试过单引号和双引号。有趣的是,在' date'中使用的值没有引号或双引号。并且' at'产生了与上面相同的结果。单引号被解释为' at'中的值的一部分。列,但不在日期列中:

enter image description here

添加parse_dates=True参数对数据框没有任何影响。

当我在R中使用这些CSV文件时,我没有遇到过这样的问题。我将非常感谢您提供此任何帮助。

2 个答案:

答案 0 :(得分:2)

我可以使用from_csv复制您的问题,问题是它使用col 0作为索引,因此传递index_col=None会起作用:

index_col int或序列,默认为0

  

用于索引的列。如果给出序列,则使用MultiIndex。与read_table不同的默认值

import pandas as pd
aTeam = pd.DataFrame().from_csv("in.csv",index_col=None)

输出:

         date at  goals.scored  goals.lost  result
0  16/09/2014  A             0           2       2
1  01/10/2014  H             4           1       1
2  22/10/2014  A             2           1       1
3  04/11/2014  H             3           3       0
4  26/11/2014  H             2           0       1
5  09/12/2014  A             4           1       1
6  25/02/2015  H             1           3       2
7  17/03/2015  A             2           0       1
8  19/08/2014  A             0           0       0

Odr using。read_csv正常工作,根据您尝试quotechar的事实,您可能想要的是有效的arg:

import pandas as pd


aTeam = pd.read_csv("in.csv")

输出:

         date at  goals.scored  goals.lost  result
0  16/09/2014  A             0           2       2
1  01/10/2014  H             4           1       1
2  22/10/2014  A             2           1       1
3  04/11/2014  H             3           3       0
4  26/11/2014  H             2           0       1
5  09/12/2014  A             4           1       1
6  25/02/2015  H             1           3       2
7  17/03/2015  A             2           0       1
8  19/08/2014  A             0           0       0

答案 1 :(得分:0)

我在这里没有问题(使用Python 2.7,Pandas 16.2)。我使用了您粘贴的文本并在我的桌面上创建了一个.csv文件,并使用两种方法将其加载到Pandas中

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:columnCount="2">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView2" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView3" />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_column="1"></LinearLayout>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/textView4" />
</GridLayout> 

您可以在read_csv和from_csv命令之间查看索引处理方式的不同行为。但是,我没有看到你提到的问题。您可以随时尝试进一步定义read_csv参数,但我怀疑这会产生实质性的差异。

您是否可以通过aTeam ['at']查询数据框来确认您的日期和“at”列是否被粉碎在一起,看看会产生什么结果?