我正在寻找有关排序数据集的最佳方法的建议。
我有以下输入(“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
功能,如下面几位用户所建议的那样。大熊猫度假方法也非常有用。
答案 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')