2016-08-05 28 views
0

我的数据集看起来像下面:填写缺少的字段使用导入CSV

W000000457,, 
,9/18/2016 11:28,37 
,4/21/2016 0:07,54 
,11/5/2016 12:05,42 
,7/14/2016 15:43,54 
W000000457 - Count,,100 
2069320,, 
,12/10/2016 0:22,12 
,9/25/2016 14:07,28 
,1/24/2016 6:54,59 
2069320 - Count,,100 
111,, 
,1/16/2016 10:25,58 
,6/11/2016 4:17,43 
,4/21/2016 7:56,47 
,3/17/2016 3:48,20 
111 - Count,,100 

的列是ID,日期,金额。我做了2个主要清洁/按摩的数据。

1)第1行中使用的ID,我填写以下行 2)行中删除与“伯爵”的所有行[0]

我的目标是得到这样的:

W000000457,9/18/2016 11:28,37 
W000000457,4/21/2016 0:07,54 
W000000457,11/5/2016 12:05,42 
W000000457,7/14/2016 15:43,54 
2069320,12/10/2016 0:22,12 
2069320,9/25/2016 14:07,28 
2069320,1/24/2016 6:54,59 
111,1/16/2016 10:25,58 
111,6/11/2016 4:17,43 
111,4/21/2016 7:56,47 
111,3/17/2016 3:48,20 

这是我的代码至今:

import csv 
    with open('data.txt','rb') as f_in: 
     reader = csv.reader(f_in) 
     row = next(reader) 
     last_row = row 
     for row in reader: 
      row = [x if x else y for x, y in zip(row, last_row)] 
      if 'COUNT' not in row[0].upper(): 
       print row 
      last_row = row 

这让我接近,但问题是处理其间的不同ID的例子中的记录:

W000000457,, 
,1/24/2016 6:54,59 
2069320 - Count,,100 
111,, 
,1/16/2016 10:25,58 

将成为(使用我的代码):

W000000457,1/24/2016 6:54,59 
111,1/24/2016 6:54,100 
111,1/16/2016 10:25,58 

ID 111的第一个实例是不是从以前的现有价值进行一个真正的价值。

或者在上面的例子中,我得到:在**都是假值

,我应该如何处理这个任何想法

W000000457,9/18/2016 11:28,37 
W000000457,4/21/2016 0:07,54 
W000000457,11/5/2016 12:05,42 
W000000457,7/14/2016 15:43,54 
**2069320,7/14/2016 15:43,100** 
2069320,12/10/2016 0:22,12 
2069320,9/25/2016 14:07,28 
2069320,1/24/2016 6:54,59 
**111,1/24/2016 6:54,100** 
111,1/16/2016 10:25,58 
111,6/11/2016 4:17,43 
111,4/21/2016 7:56,47 
111,3/17/2016 3:48,20 

领域?

我正在考虑删除每个ID的第一个实例或寻找一种方法来替换我的csvreader的[0]而不是每个字段。

回答

1

对于csv类型的数据,请使用pandas

读取数据:

import pandas as pd 
from io import StringIO 

df = pd.read_csv(StringIO('''W000000457,, 
,9/18/2016 11:28,37 
,4/21/2016 0:07,54 
,11/5/2016 12:05,42 
,7/14/2016 15:43,54 
W000000457 - Count,,100 
2069320,, 
,12/10/2016 0:22,12 
,9/25/2016 14:07,28 
,1/24/2016 6:54,59 
2069320 - Count,,100 
111,, 
,1/16/2016 10:25,58 
,6/11/2016 4:17,43 
,4/21/2016 7:56,47 
,3/17/2016 3:48,20 
111 - Count,,100'''), names=['col1', 'col2', 'col3']) 

正向填写NaN的项目在第一列:

df['col1'] = df['col1'].fillna(method='ffill') 

筛选出来的项目,其中第一列包含 '计数'

df = df[~df['col1'].str.contains('Count')] 

降仍然有NaN的行:

df = df.dropna() 

最终结果:

  col1    col2 col3 
1 W000000457 9/18/2016 11:28 37.0 
2 W000000457 4/21/2016 0:07 54.0 
3 W000000457 11/5/2016 12:05 42.0 
4 W000000457 7/14/2016 15:43 54.0 
7  2069320 12/10/2016 0:22 12.0 
8  2069320 9/25/2016 14:07 28.0 
9  2069320 1/24/2016 6:54 59.0 
12   111 1/16/2016 10:25 58.0 
13   111 6/11/2016 4:17 43.0 
14   111 4/21/2016 7:56 47.0 
15   111 3/17/2016 3:48 20.0