我想基于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])
生成一个类似于
的数据框
我想返回一个如下所示的数据框。此输出记录每行发生的法术数量。在这种情况下,c1
有2个法术,第一个出现在1962年到1964年,第二个出现并在1965年结束:
描述法术长度的数据框如下所示。例如,c1
有一个3年的法术和1年的第二个法术长度。
这种重新编码在生存分析中很有用。
答案 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