Dataframe和read_csv函数 - Python

时间:2017-11-16 00:19:09

标签: python pandas csv dataframe

我正在使用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

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

这些是可能的论据及其发展的功能:

  • inputFile:包含数据的csv文件的名称。
  • delimiter:分隔数据的字符。默认情况下,该函数必须使用逗号字符(“,”)。
  • nan:将被视为缺失值的字符串列表。此列表中某个字符串的输入文件中出现的任何内容都将被解释为NaN。默认值为None。
  • header:一个布尔标志,指示文件是否包含标头(True)或不包含(False)。默认情况下,它必须为True。
  • varNames:*字符串*的列表,仅在标题有效的情况下用作变量名称。默认值为None。
  • pref:一个字符串,仅当标头有效时才用作变量名称的前缀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函数传递的“prefix”选项,但我已经尝试了它并且它没有正确地执行它。

这是我的结果,正如您所看到的,虽然我将前缀参数传递给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

另外一个疑问是,因为我正在计算我必须分配给列的数值,所以我会修改已经生成的数据帧,我相信它不是最优的形成实现它。

1 个答案:

答案 0 :(得分:2)

这适用于我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