基于场的增量

时间:2015-04-28 15:41:08

标签: python dataset counting difference

我有一个数据集

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)。感谢。

2 个答案:

答案 0 :(得分:1)

Python库有一个很棒的实用程序,叫做itertools。在这个魔鬼里面,我们有两个叫做groupbychain的函数,而不是创造奇迹

假设您的数据集是一个字符串,让我获取第一列

>>> 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