Python 数据帧:转换符号-

Python 数据帧:转换符号-,python,pandas,dataframe,jupyter-notebook,Python,Pandas,Dataframe,Jupyter Notebook,我正在使用熊猫数据帧。如果我打印dataframe,它包含一些列,其中用脚本(-)代替数字。当我使用数据制作图表时,termninal返回: TypeError: Empty 'Series': no numeric data to plot 这些脚本(-)数据点是否可以在绘制图形时不使用?需要更换吗?如果是这样,怎么办 我写的代码是: import pandas as pd import numpy as np import matplotlib.pyplot as plt df=pd.re

我正在使用熊猫数据帧。如果我打印dataframe,它包含一些列,其中用脚本(-)代替数字。当我使用数据制作图表时,termninal返回:

TypeError: Empty 'Series': no numeric data to plot
这些脚本(-)数据点是否可以在绘制图形时不使用?需要更换吗?如果是这样,怎么办

我写的代码是:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_csv('data', sep=',')
a_list=list(df.columns.values)
#df=df.astype(float)
for ielement in range(len(a_list)):
    print ("column name is %s" %(a_list[ielement]))
    if a_list[ielement]!= 'age':
        df.plot(x='age', y=a_list[ielement])
        plt.savefig(a_list[ielement] + '.png')
        plt.clf()
Examle数据

data.csv

a,b,c,d,e,f,g,h,i,j,k,l,m,n,nn,o,p,q,r,s,t,u,v,w,x,y,z,hh
    12,2798,3.9,3.0,1.1,4.0,0.1,5.0,0.0,-,0.1,35.5,0.2,52.0,1.6,19.0,2.0,36.0,0.1,24.5,0.2,52.0,0.2,2.0,0.0,-,0.2,13.0
    13,2757,8.5,6.0,3.4,15.0,0.1,1.0,0.0,3.0,0.0,-,0.6,6.0,2.5,12.0,2.4,14.0,0.1,41.0,0.3,25.5,0.3,4.0,0.1,5.0,0.1,19.0
    14,2792,18.1,5.0,8.7,24.0,0.1,5.5,0.0,-,0.1,2.0,1.6,3.0,2.6,5.0,3.9,12.0,0.4,4.5,0.9,5.0,0.8,12.0,0.1,24.0,0.2,16.5
    15,2956,29.2,6.0,14.5,25.0,0.5,4.0,0.1,9.5,0.2,1.0,2.1,4.0,2.5,5.5,5.5,10.0,0.8,3.0,2.0,4.5,1.5,6.0,0.3,10.5,0.4,30.0
使用Evan的答案:
df.replace(to_replace='-',value=np.nan,inplace=True)
仍然得到相同的错误


它适用于第一列,因为它们没有脚本(-)

好的,根据您的评论,您有两个选项:

  • 如果列有
    -
    符号,则删除整行
  • 如果列有
    -
    符号,则可以为其设置默认值
  • 假设我有以下数据帧:

    >>> df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [11, 22, '-', 44], 'col3': ['-', 3, 5, 7]})
    >>> df.dtypes
    col1     int64
    col2    object
    col3    object
    dtype: object
    >>> df
       col1 col2 col3
    0     1   11    -
    1     2   22    3
    2     3    -    5
    3     4   44    7
    
    选择1

    选择2


    好的,根据您的意见,您有两个选择:

  • 如果列有
    -
    符号,则删除整行
  • 如果列有
    -
    符号,则可以为其设置默认值
  • 假设我有以下数据帧:

    >>> df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [11, 22, '-', 44], 'col3': ['-', 3, 5, 7]})
    >>> df.dtypes
    col1     int64
    col2    object
    col3    object
    dtype: object
    >>> df
       col1 col2 col3
    0     1   11    -
    1     2   22    3
    2     3    -    5
    3     4   44    7
    
    选择1

    选择2


    借用@Scratch'N'Purr的代码,以下是我的解决方案:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [11, 22, '-', 44], 'col3': ['-', 3, 5, 7]})
    
    df:

    输出:

    col1    col2    col3
    0   1   11.0    NaN
    1   2   22.0    3.0
    2   3   NaN     5.0
    3   4   44.0    7.0
    
    绘图:

    我没有仔细看数据;这个解决方案是否符合您的期望?第二,从
    int
    float
    在计算上很昂贵,但对于足够小的数据集来说效果很好

    编辑:参见


    要绘制
    NaN
    ,请转换为
    float
    。以上(编辑过的)代码根据OP的更新帖子生成了从a到hh的PNG图像。

    借用@Scratch'N'Purr的代码,以下是我的解决方案:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [11, 22, '-', 44], 'col3': ['-', 3, 5, 7]})
    
    df:

    输出:

    col1    col2    col3
    0   1   11.0    NaN
    1   2   22.0    3.0
    2   3   NaN     5.0
    3   4   44.0    7.0
    
    绘图:

    我没有仔细看数据;这个解决方案是否符合您的期望?第二,从
    int
    float
    在计算上很昂贵,但对于足够小的数据集来说效果很好

    编辑:参见



    要绘制
    NaN
    ,请转换为
    float
    。上述(编辑过的)代码根据OP的更新帖子生成了PNG图像a到hh。

    由于
    -
    符号不是数字,您能否给出数据帧值的示例以及用于绘制图的代码,哪些与所有值都是数字的说法相冲突?加载df后是否可以运行以下命令,并查看是否有任何列具有对象数据类型:
    df.dtypes
    ?如果有,那么这些就是错误的列,这意味着pandas将整个列视为非数字的数据类型列。有一些对象列。我能做什么?@Scratch'N'purrc由于
    -
    符号不是数字,您能给出数据帧值的示例以及用于绘制图的代码吗,哪些与所有值都是数字的说法相冲突?加载df后是否可以运行以下命令,并查看是否有任何列具有对象数据类型:
    df.dtypes
    ?如果有,那么这些就是错误的列,这意味着pandas将整个列视为非数字数据类型列。有一些对象列。我能做什么?@Scratch'N'purrhanks。但是,它不能被一个没有绘制的值所代替吗?必须有许多数据帧具有相同的丢失数据问题。如果您不想打印它,这是否与打印前删除行相同?此外,您还可以签出
    pandas.DataFrame.replace
    pandas.DataFrame.fillna
    @Evan,但我需要替换一个特殊值吗?我不想要零,因为这将是一个虚假的数据-point@Evan如果它被Nan替换,那么列仍然是对象,所以它没有用处。@santimirandarp不幸的是,你不能真正做到两全其美。如果只想打印“真”值(没有特殊字符的值),则必须从数据框中删除打印记录。但是,您可以创建一个单独的数据框,该数据框只包含具有特殊字符的行,以便仍保留这些记录以供以后分析。此外,如果您不想将这些值设置为0,可以将其更改为您想要的任何其他值。我只是将其设置为0作为示例。@Evan还对
    replace
    fillna
    方法提出了很好的观点。谢谢。但是,它不能被一个没有绘制的值所代替吗?必须有许多数据帧具有相同的丢失数据问题。如果您不想打印它,这是否与打印前删除行相同?此外,您还可以签出
    pandas.DataFrame.replace
    pandas.DataFrame.fillna
    @Evan,但我需要替换一个特殊值吗?我不想要零,因为这将是一个虚假的数据-point@Evan如果它被Nan替换,那么列仍然是对象,所以它没有用处。@santimirandarp不幸的是,你不能真正做到两全其美。如果只想打印“真”值(没有特殊字符的值),则必须从数据框中删除打印记录。但是,您可以创建一个单独的数据框,该数据框只包含具有特殊字符的行,以便仍保留这些记录以供以后分析。此外,如果您不想将这些值设置为0,可以将其更改为您想要的任何其他值。我只是将其设置为0作为示例。@Evan还对
    replace
    fillna
    方法提出了一个很好的观点。如果不设置
    inplace=True
    ,pandas将返回一个更新的
    df
    ,但不会更改存储在内存中的
    df
    的值。您可以使用
    df=df.modify(args)
    ,但我只使用
    inplace=True
    ,因为它使我的代码更具可读性
    import matplotlib.pyplot as plt
    df.plot()
    plt.show()