Python - 根据条件读取文本文件中的特定行

时间:2015-06-03 20:26:19

标签: python file line readfile

问题陈述:

我有一个文件如下。

name | date | count
John | 201406 | 1
John | 201410 | 2
Mary | 201409 | 180
Mary | 201410 | 154
Mary | 201411 | 157
Mary | 201412 | 153
Mary | 201501 | 223
Mary | 201502 | 166
Mary | 201503 | 163
Mary | 201504 | 169
Mary | 201505 | 157
Tara | 201505 | 2

该文件显示了三个人John,Mary和Tara几个月的计数数据。我想分析这些数据,并为每个人提供一个状态标签,即活动,非活动或新的。

如果一个人有201505年和其他前几个月的参赛作品,那么他们就是活跃的 - 比如Mary

如果一个人没有201505的参赛作品,就会处于非活动状态 - 比如约翰

如果一个人在201505年只有一个条目 - 就像Tara一样。

此外,如果一个人活跃,我希望得到最后 5个计数的中位数。例如,对于玛丽,我想得到平均值((157 + 169 + 163 + 166 + 223)/ 5)。

问题:

我想了解如何在Python 2.7中阅读此文件以满足我的要求。我从以下开始,但不确定如何获得特定人员的先前条目(即文件中的前一行)。

for line in data:
    col = line.split('\t')
    name = col[0]
    date = col[1]
    count = col[2]

2 个答案:

答案 0 :(得分:3)

import pandas as pd:
df = pd.read_csv('input_csv.csv') # This assumes you have a csv format file
names = {}
for name, subdf in df.groupby('name'):
    if name not in names:
        names[name] = {}
    if (subdf['date']==201505).any():
        if subdf['count'].count()==1:
            names[name]['status'] = 'new'
        else:
            names[name]['status'] = 'active'
            names[name]['last5median'] = subdf['count'].tail().median()
    else:
        names[name]['status'] = 'inactive'


>>>
{'John': {'status': 'inactive'},
 'Mary': {'last5median': 166.0, 'status': 'active'},
 'Tara': {'status': 'new'}}

答案 1 :(得分:2)

我认为你可以用dict解决你的问题。

import re

spl = """name | date | count
John | 201406 | 1
John | 201410 | 2
Mary | 201409 | 180
Mary | 201410 | 154
Mary | 201411 | 157
Mary | 201412 | 153
Mary | 201501 | 223
Mary | 201502 | 166
Mary | 201503 | 163
Mary | 201504 | 169
Mary | 201505 | 157
Tara | 201505 | 2"""

dicto = {}

listo = re.split("\\||\n",spl)
listo = [x.strip() for x in listo]
for x in range(3,len(listo),3):
    try:
        dicto[listo[x]].append([listo[x+1],listo[x+2]])
    except KeyError:
        dicto[listo[x]]= []
        dicto[listo[x]].append([listo[x+1],listo[x+2]])

print (dicto.get('John'))

输出:

[['201406', '1'], ['201410', '2']]

所以,现在你掌握了所有用户的数据,你可以用他们想要的东西