Python熊猫:从累积序列创建离散序列
我有一个数据框,其中有几组数值序列,其中的值是累积的。考虑以下事项:Python熊猫:从累积序列创建离散序列,python,pandas,Python,Pandas,我有一个数据框,其中有几组数值序列,其中的值是累积的。考虑以下事项: df = pd.DataFrame({'Cat': ['A', 'A','A','A', 'B','B','B','B'], 'Indicator': [1,2,3,4,1,2,3,4], 'Cumulative1': [1,3,6,7,2,4,6,9], 'Cumulative2': [1,3,4,6,1,5,7,12]}) In [74]:df Out[74]: Cat Cumulative1 Cumulative
df = pd.DataFrame({'Cat': ['A', 'A','A','A', 'B','B','B','B'], 'Indicator': [1,2,3,4,1,2,3,4], 'Cumulative1': [1,3,6,7,2,4,6,9], 'Cumulative2': [1,3,4,6,1,5,7,12]})
In [74]:df
Out[74]:
Cat Cumulative1 Cumulative2 Indicator
0 A 1 1 1
1 A 3 3 2
2 A 6 4 3
3 A 7 6 4
4 B 2 1 1
5 B 4 5 2
6 B 6 7 3
7 B 9 12 4
我需要为Cumulative1和Cumulative2创建离散序列,起点是“指标”中最早的条目
我的方法是使用diff
In[82]: df['Discrete1'] = df.groupby('Cat')['Cumulative1'].diff()
Out[82]: df
Cat Cumulative1 Cumulative2 Indicator Discrete1
0 A 1 1 1 NaN
1 A 3 3 2 2.0
2 A 6 4 3 3.0
3 A 7 6 4 1.0
4 B 2 1 1 NaN
5 B 4 5 2 2.0
6 B 6 7 3 2.0
7 B 9 12 4 3.0
我有3个问题:
我如何以优雅的方式避免NaN?可以在原始累积序列中找到正确的值
第二,我如何优雅地将此计算应用于所有系列,例如-
cols = ['Cumulative1', 'Cumulative2']
第三,我有很多数据需要进行计算-这是最有效的方法吗?如果不想避免NaN,则需要使用累积列中的起始值填充它们:
df['Discrete1'] = df['Discrete1'].combine_first(df['Cumulative1'])
要将操作应用于所有列或选择列,请将其广播到所有感兴趣的列:
sources = 'Cumulative1', 'Cumulative2'
targets = ["Discrete" + x[len('Cumulative'):] for x in sources]
df[targets] = df.groupby('Cat')[sources].diff()
您仍然需要在循环中调节NAN:
for s,t in zip(sources, targets):
df[t] = df[t].combine_first(df[s])