繁体   English   中英

Python熊猫:从累积中创建离散序列

[英]Python pandas: creating a discrete series from a 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创建离散序列,起始点是“ Indicator”中最早的条目。

我的方法是使用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个问题:

如何以优雅/ Python方式避免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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM