我是Python的新手,我想阅读一个包含三个字段的文本文件; X
,Y
和Time
。我想从x和y字段形成数组,只要时间字段仍然是常量。例如:
X Y Time
1 2 100
3 4 100
5 6 100
7 8 200
9 10 200
因此,对于time = 100
,我构建x_array = [1,3,5]
和y_array = [2,4,6]
作为其他进程的输入,然后在时间更改为200
时返回更新它们。
谢谢你的帮助。
答案 0 :(得分:2)
您可以使用pandas:
>>> import pandas as pd
>>> df = pd.read_csv('my_data.csv', delim_whitespace=True)
>>> df.groupby('Time')['X'].apply(list).to_dict()
{100: [1, 3, 5], 200: [7, 9]}
>>> df.groupby('Time')['Y'].apply(list).to_dict()
{100: [2, 4, 6], 200: [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]}}
答案 1 :(得分:0)
你需要一个基于时间的密钥字典,其中包括:
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]}}
答案 2 :(得分:0)
这似乎是defaultdict
应该完全涵盖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']})