Python - 提取标识符列表和相应的值

时间:2017-10-23 20:54:28

标签: python dictionary

我正在寻找有关排序数据集的最佳方法的建议。

我有以下输入(“data.txt”):

100    G(1,2)            1.0943        
100    G(1,3)            1.0933
101    G(1,2)            1.5147        
101    G(1,3)            1.2372
101    G(1,4)            1.0955
... (10,000)

理想的输出是一个带有列的文本文件:

 G(1,2)        G(1,3)         G(1,4)
 1.0943        1.0933         1.0955
 1.5147        1.2372

我的第一个想法是创建一个包含多个值的字典 - 其中每个'G(x,x)'是一个键,相应的数字是一个值。

这是解决此问题的最佳方法,还是有其他一些python函数可以提高排序效率?

感谢大家的建议 - 我正在考虑利用/了解itertools.groupby功能,如下面几位用户所建议的那样。大熊猫度假方法也非常有用。

4 个答案:

答案 0 :(得分:1)

您可以使用itertools.groupby

import re
import itertools
data = [[b for b in c if b] for c in [re.split("\s+", i.strip('\n')) for i in open('file.txt')] if c]
new_final_data = [(a, list(b)) for a, b in itertools.groupby(sorted(data, key=lambda x:x[1][-2]), key=lambda x:x[1])]
final_data = {a:[[c for c in i if re.findall('\d+\.\d+', c)][0] for i in b] for a, b in new_final_data}
print(final_data)

输出:

{'G(1,3)': ['1.0933', '1.2372'], 'G(1,4)': ['1.0955'], 'G(1,2)': ['1.0943', '1.5147']}

答案 1 :(得分:1)

我认为你可以将它作为转置函数,然后是groupby。 https://pandas.pydata.org/pandas-docs/stable/dsintro.html?highlight=transpose

答案 2 :(得分:1)

在直接python中(使用shell):

import re
from collections import defaultdict    

data = defaultdict(list)

with open('data.txt') as f:
    for line in f:
        match = re.match('.*(G\(\d,\d\))\s*(.*)', line)
        g = match.group(1)
        datum = float(match.group(2))
        data[g].append(datum)


for g in data:
    data[g].sort()

# do something with data.

答案 3 :(得分:1)

大熊猫的做法是这样的:

TypeError: rename: src should be string, bytes or os.PathLike, not list

输出:

import pandas as pd

df = pd.read_csv(r'data.txt', names = ['col1', 'col2', 'col3'])
df = df[['col2', 'col3']]
df = df.pivot(columns = 'col2', values = 'col3')
df = df.apply(lambda x: pd.Series(x.dropna().values))
df = df.to_csv(r'output.txt', index = False, sep = '\t')