Как я могу заменить NaN в строке со значениями в другой строке Панды - PullRequest
0 голосов
/ 24 декабря 2018

Я пробовал несколько способов заменить NaN в строке значениями в другой строке, но ни один из них не работал так, как ожидалось.Вот мой Dataframe:

test = pd.DataFrame(
    {
        "a": [1, 2, 3, 4, 5], 
        "b": [4, 5, 6, np.nan, np.nan], 
        "c": [7, 8, 9, np.nan, np.nan], 
        "d": [7, 8, 9, np.nan, np.nan]
     }
)

   a    b    c    d
0  1   4.0  7.0  7.0
1  2   5.0  8.0  8.0
2  3   6.0  9.0  9.0
3  4   NaN  NaN  NaN
4  5   NaN  NaN  NaN

Мне нужно заменить NaN в 4-й строке на значения в первой строке, т. Е.

   a     b     c     d
0  1   **4.0   7.0   7.0**
1  2    5.0   8.0   8.0
2  3    6.0   9.0   9.0
3  4   **4.0   7.0   7.0**
4  5    NaN   NaN   NaN

И второй вопрос: как я могу умножить некоторые / часть?значения в строке на число, например, мне нужно удвоить значения во вторых двух, когда столбцы ['b', 'c', 'd'], то результат:

   a     b     c     d
0  1    4.0   7.0   7.0
1  2   **10.0  16.0  16.0**
2  3    6.0   9.0   9.0
3  4    NaN   NaN   NaN
4  5    NaN   NaN   NaN

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Индексирование с метками

Если вы хотите фильтровать по a, а значения a уникальны, рассмотрите возможность сделать его индексом, чтобы упростить вашу логику и , чтобы сделать ее более эффективной:

test = test.set_index('a')
test.loc[4] = test.loc[4].fillna(test.loc[1])
test.loc[2] *= 2

Булевы маски

Если a не уникален и требуются логические маски, вы все равно можете использовать fillna с дополнительным шагом ::

mask = test['a'].eq(4)
test.loc[mask] = test.loc[mask].fillna(test.loc[test['a'].eq(1).idxmax()])
test.loc[test['a'].eq(2)] *= 2
0 голосов
/ 24 декабря 2018

Прежде всего, я предлагаю вам прочитать Индексирование и выбор данных в пандах.Возвращаясь к первому вопросу, вы можете использовать .loc() с isnull() для выполнения логического индексирования значений столбцов:

mask_nans = test.loc[3,:].isnull()
test.loc[3, mask_nans] = test.loc[0, mask_nans]

И для удвоения значений, которые выможет непосредственно умножить на 2 нарезанный кадр данных, также используя .loc():

test.loc[1,'b':] *= 2

   a     b     c     d
0  1   4.0   7.0   7.0
1  2  10.0  16.0  16.0
2  3   6.0   9.0   9.0
3  4   4.0   7.0   7.0
4  5   NaN   NaN   NaN
...