我有一个数据集
Sample1 1
Sample1 2
Sample1 3
Sample2 4
Sample2 5
Sample3 6
希望它成为
Sample1 1
Sample1 2
Sample1 3
Sample2 1
Sample2 2
Sample3 1
我已经看过很多关于如何在SQL和其他语言中执行此操作的帖子,但不是python。任何帮助将不胜感激(Python 2.5)。感谢。
答案 0 :(得分:1)
Python库有一个很棒的实用程序,叫做itertools。在这个魔鬼里面,我们有两个叫做groupby
和chain
的函数,而不是创造奇迹
假设您的数据集是一个字符串,让我获取第一列
>>> dataset = zip(*map(str.split, dataset.splitlines()))[0]
分组是最重要的。具有相同数据的所有行组合在一起。您只需要使用一个可以创建的计数器为其后缀,范围从1到每个组的长度
>>> #Tools of trade, just import them
>>> from itertools import groupby, chain
>>> #Now group your data
>>> grp = [[(key, str(count))
for count in range(1, len(list(grp)) + 1)]
for key, grp in groupby(dataset)]
>>> print grp
>>> #You can see how the data is already grouped
>>> [[('Sample1', '1'), ('Sample1', '2'), ('Sample1', '3')], [('Sample2', '1'), ('Sample2', '2')], [('Sample3', '1')]]
最后重新格式化数据以匹配原始输入数据集
>>> #Now recreate your dataset from the grouped data
>>> dataset = '\n'.join('\t'.join(row) for row in chain.from_iterable(grp))
>>> print dataset
以下是您的输出结果如何
Sample1 1
Sample1 2
Sample1 3
Sample2 1
Sample2 2
Sample3 1
答案 1 :(得分:0)
您可以使用Pandas
加载此txt文件,我添加了一些列名称。
In [132]:
t="""Sample1 1
Sample1 2
Sample1 3
Sample2 4
Sample2 5
Sample3 6"""
df = pd.read_csv(io.StringIO(t), sep='\s+', header=None, names=['Sample', 'Value'])
df
Out[132]:
Sample Value
0 Sample1 1
1 Sample1 2
2 Sample1 3
3 Sample2 4
4 Sample2 5
5 Sample3 6
加载到数据框后,我们可以执行groupby
,然后在Value列上调用transform
,我们传递一个调用rank
的lambda,这将返回值的排名方法'第一'对于每个样本组,transform返回一个与原始df对齐的系列:
In [133]:
df['Value'] = df.groupby('Sample')['Value'].transform(lambda x: x.rank(method='first'))
df
Out[133]:
Sample Value
0 Sample1 1
1 Sample1 2
2 Sample1 3
3 Sample2 1
4 Sample2 2
5 Sample3 1