Python - 根据条件读取文本文件中的特定行
Python - Read specific lines in a text file based on a condition
问题陈述:
我有一个文件如下。
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 和之前其他月份的条目,那么这个人就是活跃的 - 比如玛丽
如果某人没有 201505 的条目,则该人不活跃 - 例如约翰
如果一个人在 201505 年只有 1 个条目,那么他就是新人 - 比如 Tara。
此外,如果一个人很活跃,我想得到他们 last 5 计数的中位数。例如,对于 Mary,我想得到的平均值为 ((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]
我认为你可以用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']]
所以,现在您拥有所有数据,所有用户都在您的字典中,您可以随心所欲地使用它们
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'}}
问题陈述:
我有一个文件如下。
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 和之前其他月份的条目,那么这个人就是活跃的 - 比如玛丽
如果某人没有 201505 的条目,则该人不活跃 - 例如约翰
如果一个人在 201505 年只有 1 个条目,那么他就是新人 - 比如 Tara。
此外,如果一个人很活跃,我想得到他们 last 5 计数的中位数。例如,对于 Mary,我想得到的平均值为 ((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]
我认为你可以用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']]
所以,现在您拥有所有数据,所有用户都在您的字典中,您可以随心所欲地使用它们
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'}}