Как перераспределить значение, равное между значениями NaN в пандах? - PullRequest
2 голосов
/ 11 марта 2019

У меня есть следующий фрейм данных:

                'B'         'C'
1/1/2017    'A' 
            BTC NaN       0.367392
            ETH NaN       0.367392
            XRP 0.164735  0.164735
            LTC 0.100481  0.100481
1/2/2017    BTC NaN       0.315265
            XRP NaN       0.315265
            ETH NaN       0.315265
            LTC 0.054204  0.054204

Я хочу перераспределить (1 - df ['B']. Groupby (level = 0) .sum ()) поровну между значениями NaN. Столбец «С» является примером ожидаемого результата.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вы можете использовать GroupBy.transform на первом уровне MultiIndex с sum, для второго подсчета количества NaN путем проверки пропущенных значений на Series.isna с sum, разделите и замените пропущенные значения:

print (df)
                     C         D
A        B                      
1/1/2017 BTC       NaN  0.367392
         ETH       NaN  0.367392
         XRP  0.164735  0.164735
         LTC  0.100481  0.100481
1/2/2017 BTC       NaN  0.315265
         XRP       NaN  0.315265
         ETH       NaN  0.315265
         LTC  0.054204  0.054204

sum1 = 1 - df['C'].groupby(level=0).transform('sum')
len1 = df['C'].isna().groupby(level=0).transform('sum')

df['E'] = df['C'].fillna(sum1 / len1)
print (df)
                     C         D         E
A        B                                
1/1/2017 BTC       NaN  0.367392  0.367392
         ETH       NaN  0.367392  0.367392
         XRP  0.164735  0.164735  0.164735
         LTC  0.100481  0.100481  0.100481
1/2/2017 BTC       NaN  0.315265  0.315265
         XRP       NaN  0.315265  0.315265
         ETH       NaN  0.315265  0.315265
         LTC  0.054204  0.054204  0.054204
0 голосов
/ 11 марта 2019

Это должно сделать это. Вы можете получить больше информации о том, как посчитать значения, отличные от нан, от здесь и isnull() от здесь .

Независимо от того, какой ответ вы используете, всегда ловите случай, когда в столбце нет значения NaN. В этом случае оба ответа приведут к ошибке деления на ноль.

import pandas as pd
import numpy as np
test = [np.NAN,np.NAN,np.NAN,np.NAN,0.123128,0.1238123]
df = pd.DataFrame({"B":test})
df["C"] = df["B"].copy()
df["C"][df["C"].isnull()] = (1-df["B"].dropna().sum())/(len(df["B"]) - df["B"].count())
print(df)

Выход:

          B         C
0       NaN  0.188265
1       NaN  0.188265
2       NaN  0.188265
3       NaN  0.188265
4  0.123128  0.123128
5  0.123812  0.123812
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...