Как я могу изменить значения на NaN в фрейме данных pandas для определенных строк?

#python #pandas

#python #pandas

Вопрос:

В настоящее время я рассчитываю соотношение денежных средств к цене примерно для 19 000 компаний за последние 10 лет. У меня есть все это в одном фрейме данных и более 20 переменных. Проблема, которую я хотел бы решить, заключается в перезапуске скользящей суммы после введения нового биржевого тикера. Способ, который я закодировал ниже, приводит к тому, что первые три записи нового запаса также суммируют Q_Cashflow запаса непосредственно перед ним в столбце.

Я закодировал следующим образом:

 df['K_Cashflow'] = df.Q_Cashflow.rolling(4).sum()
df['cash-to-price'] = df['K_Cashflow']/df['Market Cap']
 

Вывод :

    Ticker Symbol    |Q_Cashflow |Market Cap |cash-to-price  |K_Cashflow|
44     ADCT.1       |    16.9   |709.0700   |0.120157       |  85.2    |
45     ADCT.1       |   102.2   |718.7700   |0.310948       |  223.5   |
46     ADCT.1       |   136.6   |1231.5240  |0.260815       |  321.2   |
47     AAL          |   456.0   |3034.1766  |0.234561       |  711.7   |
48     AAL          |  1173.0   |2258.1468  |0.827138       | 1867.8   |
49     AAL          |  1090.0   |2088.2862  |1.367437       | 2855.6   |
50     AAL          |  1241.0   |2597.5755  |1.524499       | 3960.0   |
 

Строки 47:50 должны быть NaN для K_Cashflow.
Как мне изменить первые три записи K_Cashflow на Nan для каждого отдельного символа тикера?

Ответ №1:

Одним из способов добиться этого было бы создать столбец ранга на основе тикера, а затем присвоить nan три нижних ранга. Вот пример:

 import numpy as np
import pandas as pd

df = pd.DataFrame({
    'ticker': ['a'] * 7   ['b'] * 10,
    'cash_flow': range(17),
})

# Create the rank
df['rank'] = df.groupby('ticker').rank()

# Set the first 3 instances of each ticker to nan
df.loc[df['rank'] < 4, ['cash_flow']] = np.nan

df 
   ticker  cash_flow  rank
0       a        NaN   1.0
1       a        NaN   2.0
2       a        NaN   3.0
3       a        3.0   4.0
4       a        4.0   5.0
5       a        5.0   6.0
6       a        6.0   7.0
7       b        NaN   1.0
8       b        NaN   2.0
9       b        NaN   3.0
10      b       10.0   4.0
11      b       11.0   5.0
12      b       12.0   6.0
13      b       13.0   7.0
14      b       14.0   8.0
15      b       15.0   9.0
16      b       16.0  10.0
 

Комментарии:

1. Это отличное предложение и будет очень полезно. Я получил TypeError: объект ‘NoneType’ недоступен для вызова после попытки использовать функцию ранга pandas. Есть ли что-то, что мне нужно отформатировать в моем наборе данных?