Python基于字段值将文本文件切片为数组
我是Python新手,我想读一个包含三个字段的文本文件<代码>X,Python基于字段值将文本文件切片为数组,python,arrays,timestamp,Python,Arrays,Timestamp,我是Python新手,我想读一个包含三个字段的文本文件X,Y和时间。只要时间场仍然是常数,我想从x和y场形成数组。例如: X Y Time 1 2 100 3 4 100 5 6 100 7 8 200 9 10 200 因此,对于time=100,我构建x_数组=[1,3,5]和y_数组=[2,4,6]作为其他进程的输入,然后在时间变为200时返回更新它们。 谢谢您的帮助。您需要一本基于时间的钥匙字典,大致如下
Y
和时间
。只要时间场仍然是常数,我想从x和y场形成数组。例如:
X Y Time
1 2 100
3 4 100
5 6 100
7 8 200
9 10 200
因此,对于time=100
,我构建x_数组=[1,3,5]
和y_数组=[2,4,6]
作为其他进程的输入,然后在时间变为200
时返回更新它们。
谢谢您的帮助。您需要一本基于时间的钥匙字典,大致如下:
with open('file.txt') as f:
data = {}
next(f) # Skip header
for line in f:
x, y, time = map(int, line.strip().split())
data.setdefault(time, {})
data[time].setdefault('X', []).append(x)
data[time].setdefault('Y', []).append(y)
data
# {100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}
您需要一本基于时间的键词典,大致如下:
with open('file.txt') as f:
data = {}
next(f) # Skip header
for line in f:
x, y, time = map(int, line.strip().split())
data.setdefault(time, {})
data[time].setdefault('X', []).append(x)
data[time].setdefault('Y', []).append(y)
data
# {100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}
这似乎是一项需要
csv
模块DictReader
很好地完成的任务。这将创建一段非常可读的代码用于解析:
import csv
from collections import defaultdict
# these two will hold xs and ys by time point
xs = defaultdict(list)
ys = defaultdict(list)
with open("yourfile.csv") as csvfile:
reader = csv.DictReader(csvfile, delimiter='\t')
for row in reader:
# get time point for row
t = row['Time']
# add x point
xs[t].append(row['X'])
# add y point
ys[t].append(row['Y'])
print xs
print ys
输出:
defaultdict(,{'200':['7','9'],'100':['1','3','5']})
defaultdict(,{'200':['8','10'],'100':['2','4','6']})
这似乎是一项需要
csv
模块DictReader
很好地完成的任务。这将创建一段非常可读的代码用于解析:
import csv
from collections import defaultdict
# these two will hold xs and ys by time point
xs = defaultdict(list)
ys = defaultdict(list)
with open("yourfile.csv") as csvfile:
reader = csv.DictReader(csvfile, delimiter='\t')
for row in reader:
# get time point for row
t = row['Time']
# add x point
xs[t].append(row['X'])
# add y point
ys[t].append(row['Y'])
print xs
print ys
输出:
defaultdict(,{'200':['7','9'],'100':['1','3','5']})
defaultdict(,{'200':['8','10'],'100':['2','4','6']})
解决方案
您可以使用:
解释
这将读取您的文件:
df = pd.read_csv('my_data.csv', delim_whitespace=True)
在这样的数据帧中:
现在,您可以按Time
分组,并将X
中的条目转换为列表:
df.groupby('Time')['X'].apply(list)
这将为您提供以下系列:
Time
100 [1, 3, 5]
200 [7, 9]
Name: X, dtype: object
最后,使用to_dict()
将其转换为字典:
>>> df.groupby('Time')['X'].apply(list).to_dict()
{100: [1, 3, 5], 200: [7, 9]}
替代解决方案:
这将为您提供不同的结果安排:
>>> df.groupby('Time').apply(lambda x: {'X': list(x['X']), 'Y': list(x['Y'])}).to_dict()
{100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}
解决方案
您可以使用:
解释
这将读取您的文件:
df = pd.read_csv('my_data.csv', delim_whitespace=True)
在这样的数据帧中:
现在,您可以按Time
分组,并将X
中的条目转换为列表:
df.groupby('Time')['X'].apply(list)
这将为您提供以下系列:
Time
100 [1, 3, 5]
200 [7, 9]
Name: X, dtype: object
最后,使用to_dict()
将其转换为字典:
>>> df.groupby('Time')['X'].apply(list).to_dict()
{100: [1, 3, 5], 200: [7, 9]}
替代解决方案:
这将为您提供不同的结果安排:
>>> df.groupby('Time').apply(lambda x: {'X': list(x['X']), 'Y': list(x['Y'])}).to_dict()
{100: {'X': [1, 3, 5], 'Y': [2, 4, 6]}, 200: {'X': [7, 9], 'Y': [8, 10]}}