【问题标题】:Dataframe and read_csv function - Python数据框和 read_csv 函数 - Python
【发布时间】:2018-04-29 09:26:30
【问题描述】:

我正在使用 pandas 库来制作一个简单的程序。

首先,我有一个名为 small.csv 的 .csv 文件,其中包含以下结构。

1,4.0,?,?,none,?
2,2.0,3.0,?,none,38
2,2.5,2.5,?,tc,39

在我的主要功能上,我有以下代码:

def main():
    # my code here
    fname = "/home/sergio/PycharmProjects/practica2/small.csv"
    sep = ","
    vars = ["x1", "x2", "x3", "x4", "x5", "x6"]
    na_values = ["?", "none"]
    prefix = "col_"

    df = da.load_data(fname, delimiter=sep, nan=na_values,
                      header=False, pref=prefix)
    print df

main 函数的解释如下,根据我传递给 load_data 函数的参数,您必须以一种或另一种方式从我的 .csv 文件中加载数据。

这些是可能的参数和它们开发的功能:

  • inputFile:包含数据的 csv 文件的名称。
  • 分隔符:分隔数据的字符。默认情况下,该函数必须使用逗号字符 (",")。
  • nan:将被视为缺失值的字符串列表。此列表中的字符串之一在输入文件中的任何出现都将被解释为 NaN 。默认值为无。
  • header:一个布尔标志,将指示文件是否包含标头 (True) 或不包含标头 (False)。默认情况下它必须是 True 。
  • varNames:* Strings * 列表,仅在 header 为有效 False 的情况下用作变量名。默认值为 None 。
  • pref:一个字符串,仅在 header 为有效 False 且列表尚未定义 * varNames 的情况下用作变量名称的前缀。例如,如果 pref = "x",则变量的名称将为 "x0"、"x1"、"x2" 等。默认值为 "var_"。

我的 load_data 函数:

def load_data(inputFile, delimiter=",", nan=None, header=True,
              varNames=None, pref="var_"):

    data = DataFrame()

    if header == False:
        if not varNames:
            print "header=false and varNames not defined"
            data = pd.read_csv(inputFile, sep=delimiter, na_values=nan,  prefix=pref, header=None)
            listaNum = list(range(len(data.columns)))
            data.columns = listaNum
        else: # varNames defined
            data = pd.read_csv(inputFile, sep=delimiter, na_values=nan,  prefix=pref)
    else:
        return data

这个函数负责根据我们输入的参数显示数据,根据情况改变输出

我必须评估的情况之一如下。

如果 header = False 并且变量 varsNames 表示列的名称没有传递给该函数(Null),我必须将一个数值从 0 分配给具有的列数,即 0 1 2 ... 最多列数。

同样在这种情况下,我必须添加我们传递给定义列的数字的前缀,在这种情况下它将是“col_”。

结果如下:

  col_0 col_1   col_2   col_3   col_4   col_5
0   1   4.0      NaN    NaN      NaN    NaN
1   2   2.0      3.0    NaN      NaN    38.0
2   2   2.5      2.5    NaN       tc    39.0

这是我的问题,如果我评论说我们必须为每个数字列添加一个前缀,使用变量前缀,我可以手动完成,也就是说,我的每个元素列列表,添加字符串“col_”。

但是我认为这是错误的,因为我没有使用可以通过 read_csv 函数传递的“前缀”选项,所以我仍然尝试过,但它没有正确执行。

这是我的结果,如您所见,尽管我将前缀参数传递给 read_csv 函数,但它忽略了它。

   0    1    2   3    4     5
0  1  4.0  NaN NaN  NaN   NaN
1  2  2.0  3.0 NaN  NaN  38.0
2  2  2.5  2.5 NaN   tc  39.0

另外一个疑问是,由于我正在计算必须分配给列的数值,因此我会修改已经生成的数据框,我认为这不是最佳的形式来实现它。

【问题讨论】:

  • 这是一大堆文字,所以我再问一次。你的问题是什么,你哪里出错了?
  • 看 load_function,我必须在我的数字列示例中添加前缀,但该函数无法正常工作,在这种情况下,在主函数上我传递了“col_”,但这没有添加到名称中要显示的列数,而不是 0 1 2 ... as col1 col2 col3 ...
  • 我无法重现您的问题,但如果您看到我的回答,我可以为您提供解决方法。

标签: python pandas csv dataframe


【解决方案1】:

这对我在v0.21 上很有效。

import io

text = \
'''1,4.0,?,?,none,?
2,2.0,3.0,?,none,38
2,2.5,2.5,?,tc,39'''

buf = io.StringIO(text)  

df = pd.read_csv(buf, na_values=['?', 'none'], header=None, prefix='col_') 
df

col_0  col_1  col_2  col_3 col_4  col_5
0      1    4.0    NaN    NaN   NaN    NaN
1      2    2.0    3.0    NaN   NaN   38.0
2      2    2.5    2.5    NaN    tc   39.0

另一个技巧(如果这个仍然不起作用)是使用add_prefix

df

   0    1    2   3    4     5
0  1  4.0  NaN NaN  NaN   NaN
1  2  2.0  3.0 NaN  NaN  38.0
2  2  2.5  2.5 NaN   tc  39.0

df = df.add_prefix('col_')    
df

   col_0  col_1  col_2  col_3 col_4  col_5
0      1    4.0    NaN    NaN   NaN    NaN
1      2    2.0    3.0    NaN   NaN   38.0
2      2    2.5    2.5    NaN    tc   39.0

【讨论】:

  • 谢谢,我认为使用 None 或 False 是个问题。 ggrrrg
猜你喜欢
  • 2021-06-08
  • 2016-08-14
  • 2020-07-24
  • 2022-01-17
  • 1970-01-01
  • 2018-08-18
  • 2016-10-17
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多