熊猫拉错列

时间:2018-10-23 18:23:07

标签: python pandas

我有一个结构如下的csv:

use warnings;
use strict;
use feature 'say';

my ($ref_file, $data_file) = @ARGV;
die "Usage: $0 ref-file data-file\n" if not $ref_file or not $data_file;

open my $fh, '<', $ref_file or die "Can't open $ref_file: $!";
my %rows;
while (<$fh>) {
    my (undef, $idx, $row_id) = split;
    for (split /,/, $row_id) {
        push @{$rows{$_}}, $idx;        # elem => [ indices ]
    }
}

my $outfile = 'new_' . $data_file;
open    $fh,     '<', $data_file  or die "Can't open $data_file: $!";
open my $fh_out, '>', $outfile    or die "Can't open $outfile: $!";

my @ref = split ' ', <$fh>;
shift @ref;                  # toss the first field

while (<$fh>) {
    my ($row_id, @data) = split;

    if (exists $rows{$row_id}) {              # this row needs attention
        my @new_row = @ref;
        foreach my $idx (@{$rows{$row_id}}) { # keep data at these indices
            $new_row[$idx] = $data[$idx];
        }
        say $fh_out join "\t", $row_id, @new_row;
    }
    else {                                    # use whole reference line
        say $fh_out join "\t", $row_id, @ref;
    }
}

我正在尝试从“栏”列中提取值,但我得到的只是“ bloop”。

这是我要拉“需要”的方式:

_________________________
|foo  | bar |     |     |
|     |need |bleep|bloop|
|     |this |bleep|bloop|

我无法弄清楚为什么我只得到“ bloop”而不是“ need”。我也尝试过使用:

df = pd.read_csv('PATH\TO\FILE')
value = df.iloc[1]['bar']
print(value)

>bloop

获取第二列,但无济于事。

编辑:这是前几条csv行的格式,由于敏感信息而不得不更改。

df.iloc[:,1]

2 个答案:

答案 0 :(得分:3)

问题是标题行没有足够的字段。因此,pandas假设前两列是索引,并为您提供两列foobar,这使它可以正确地分析文件并避免这种情况错误:

df = pd.read_csv('test.csv', header=None)
  

ParserError:标记数据时出错。 C错误:行中应有2个字段   2,看到了4

由于更改基础数据有时很麻烦,因此只需跳过第一行并手动设置列名即可。

df = pd.read_csv('test.csv', skiprows=1)
df.columns=['foo', 'bar', 0, 1]

输出:

   foo   bar                                                0       1
0  NaN  need  some stuff, and, more, other, blah stuff, stuff   bloop
1  NaN  need                    pretty, much, the, same stuff  bloop 

答案 1 :(得分:1)

打开您的CSV文件。从以下位置更改标题:

foo,bar

收件人:

foo,bar,,

然后重新运行代码。