基于pandas中的相等性计算数据的拼写长度

时间:2014-08-06 04:52:00

标签: python pandas

我想基于pandas数据帧中相邻列的相等性计算spell个长度。这样做的最佳方式是什么?

一个例子:

import pandas as pd
d1 = pd.DataFrame([['4', '4', '4', '5'], ['23', '23', '24', '24'], ['112', '112', '112', '112']], 
              index=['c1', 'c2', 'c3'], columns=[1962, 1963, 1964, 1965])

生成一个类似于

的数据框

enter image description here

我想返回一个如下所示的数据框。此输出记录每行发生的法术数量。在这种情况下,c1有2个法术,第一个出现在1962年到1964年,第二个出现并在1965年结束:

enter image description here

描述法术长度的数据框如下所示。例如,c1有一个3年的法术和1年的第二个法术长度。

enter image description here

这种重新编码在生存分析中很有用。

2 个答案:

答案 0 :(得分:1)

以下适用于您的数据集,需要提出问题以减少我使用list comprehensions and itertools的原始答案:

In [153]:

def num_spells(x):
    t = list(x.unique())
    return [t.index(el)+1 for el in x]

d1.apply(num_spells, axis=1)

Out[153]:
    1962  1963  1964  1965
c1     1     1     1     2
c2     1     1     2     2
c3     1     1     1     1

In [144]:
from itertools import chain, repeat
def spell_len(x):
    t = list(x.value_counts())
    return list(chain.from_iterable(repeat(i,i) for i in t))

d1.apply(spell_len, axis=1)
Out[144]:
    1962  1963  1964  1965
c1     3     3     3     1
c2     2     2     2     2
c3     4     4     4     4

答案 1 :(得分:0)

我更新了@EdChum建议的num_spells,并考虑了np.nan值的存在

def compute_number_of_spells(wide_df):
    """
    Compute Number of Spells in a Wide DataFrame for Each Row
    Columns : Time Data
    """
    def num_spells(x):
        """ Compute the spells in each row """
        t = list(x.dropna().unique())
        r = []
        for el in x:
            if not np.isnan(el):                
                r.append(t.index(el)+1)
            else:
                r.append(np.nan)            #Handle np.nan case
        return r
    wide_df = wide_df.apply(num_spells, axis=1)
    return wide_df