簡體   English   中英

使用導入的csv填寫缺少的字段

[英]fill in missing fields using import 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]行中所有帶有“ Count”的行

我的目標是得到這樣的東西:

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]而不是每個字段的方式。

對於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM