Python панды: создание дискретного ряда из совокупного - PullRequest
0 голосов
/ 18 октября 2018

У меня есть фрейм данных, в котором есть несколько групп числовых рядов, где значения являются накопительными.Рассмотрим следующее:

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 вопроса:

Как мне избежать NaN элегантным / Pythonic способом?Правильные значения должны быть найдены в исходном накопительном ряду.

Во-вторых, как мне элегантно применить это вычисление ко всем рядам, скажем -

 cols = ['Cumulative1', 'Cumulative2']

В-третьих, у меня многоданные, которые требуют этого вычисления - это самый эффективный способ?

1 Ответ

0 голосов
/ 18 октября 2018

Вы не хотите избегать 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...