【问题标题】:python: data was added an extra column after sampled to a small datasetpython:数据在采样到一个小数据集后添加了一个额外的列
【发布时间】:2018-12-03 11:07:32
【问题描述】:

这对我来说很奇怪:

我有一个 5 列的 csv 数据集,前几行如下:

1,2268318,2520377,pv,1511544070
1,2333346,2520771,pv,1511561733
1,2576651,149192,pv,1511572885
1,3830808,4181361,pv,1511593493
1,4365585,2520377,pv,1511596146
1,4606018,2735466,pv,1511616481

数据采样代码:

df = pd.read_csv(
        filename,
        header=0
        )
ddf = df.sample(n=100150)
ddf.to_csv(samplename, sep=',')

生成的采样文件如下:

1,2268318,2520377,pv,1511544070
50533941,564438,1311198,2806049,pv,1511700754
53243335,689136,111697,154040,pv,1512264559
68168213,452960,119903,1151115,pv,1511711183
18695132,942795,2288684,1526856,pv,1511594854

由于某些奇怪的原因,您可以看到采样数据包含 6 列,但第一行除外(第一行是正确的)。

代码有什么问题?如何获得随机生成的样本(比例可调)?

我在 spyder/pycharm 中使用 python 3.6。

谢谢。

【问题讨论】:

  • 我建议您阅读read_csvto_csv 的文档。在那里你会注意到header=0 for read_csv 是默认值,这意味着第一行被视为标题。你很可能想要header=None

标签: python sample


【解决方案1】:

我认为问题是您的第一个数据行设置为列名。

因此需要将 header=0 更改为 header=None 以获取默认的 RangeIndex 列名称。

import pandas as pd

temp=u"""1,2268318,2520377,pv,1511544070
1,2333346,2520771,pv,1511561733
1,2576651,149192,pv,1511572885
1,3830808,4181361,pv,1511593493
1,4365585,2520377,pv,1511596146
1,4606018,2735466,pv,1511616481"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=None)

print (df)
   0        1        2   3           4
0  1  2268318  2520377  pv  1511544070
1  1  2333346  2520771  pv  1511561733
2  1  2576651   149192  pv  1511572885
3  1  3830808  4181361  pv  1511593493
4  1  4365585  2520377  pv  1511596146
5  1  4606018  2735466  pv  1511616481

额外的第一列称为索引,如果需要删除它,如果将DataFrame 写入csv 使用参数index=False 并删除列名称header=None

df.to_csv(file, index=False, header=None)

1,2268318,2520377,pv,1511544070
1,2333346,2520771,pv,1511561733
1,2576651,149192,pv,1511572885
1,3830808,4181361,pv,1511593493
1,4365585,2520377,pv,1511596146
1,4606018,2735466,pv,1511616481

编辑:

我建议创建自定义列名称,以便通过参数names 更轻松地处理数据(header=None 不是必需的)并删除某些列使用drop

import pandas as pd

temp=u"""1,2268318,2520377,pv,1511544070
1,2333346,2520771,pv,1511561733
1,2576651,149192,pv,1511572885
1,3830808,4181361,pv,1511593493
1,4365585,2520377,pv,1511596146
1,4606018,2735466,pv,1511616481"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), names=['col1','col2','col3','col4','col5'])
print (df)
   col1     col2     col3 col4        col5
0     1  2268318  2520377   pv  1511544070
1     1  2333346  2520771   pv  1511561733
2     1  2576651   149192   pv  1511572885
3     1  3830808  4181361   pv  1511593493
4     1  4365585  2520377   pv  1511596146
5     1  4606018  2735466   pv  1511616481

df1 = df.drop('col4', axis=1)
print (df1)
   col1     col2     col3        col5
0     1  2268318  2520377  1511544070
1     1  2333346  2520771  1511561733
2     1  2576651   149192  1511572885
3     1  3830808  4181361  1511593493
4     1  4365585  2520377  1511596146
5     1  4606018  2735466  1511616481

【讨论】:

  • 感谢您的快速回答。但是不正确,新数据集变为:,0,1,2,3,4 2537115,197638,1046007,4756105,pv,1511606930 以某种方式添加了一个额外的列。
  • 它额外的列称为索引,如果需要在写入csv时将其删除,请使用df.to_csv(file, index=False, header=None)
  • 谢谢。 df = pd.read_csv(filename,index=False,header=None) TypeError: parser_f() got an unexpected keyword argument 'index'
  • @Choix - 在 read_csv 中没有参数 index,因为每个 DataFrame 都有索引,默认为 RangeIndex。如果仅写入 csv,则可以删除。
  • 非常感谢@jezrael。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多