Панды создают новый столбец на основе первых уникальных значений существующего столбца - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь добавить новый столбец в фрейм данных только с уникальными значениями из существующего столбца.В новом столбце будет меньше строк со значениями np.nan, где были бы дубликаты.

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[3,4,3,4,5]})
df

    a   b
0   1   3
1   2   4
2   3   3
3   4   4
4   5   5

Цель:

    a   b   c
0   1   3   3
1   2   4   4
2   3   3   nan
3   4   4   nan
4   5   5   5

Я пробовал:

df['c'] = np.where(df['b'].unique(), df['b'], np.nan)

Бросает: operands could not be broadcast together with shapes (3,) (5,) ()

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Использование duplicated с np.where:

df['c'] = np.where(df['b'].duplicated(),np.nan,df['b'])

Или:

df['c'] = df['b'].where(~df['b'].duplicated(),np.nan)

print(df)
   a  b    c
0  1  3  3.0
1  2  4  4.0
2  3  3  NaN
3  4  4  NaN
4  5  5  5.0
0 голосов
/ 14 ноября 2018

ppg писал:

df['c'] = df['b'].mask(df['b'].duplicated())

print(df)

   a  b    c
0  1  3  3.0
1  2  4  4.0
2  3  3  NaN
3  4  4  NaN
4  5  5  5.0

Мне нравится код, но последний столбец также должен дать NaN

    0  1  3  3.0
    1  2  4  4.0
    2  3  3  NaN
    3  4  4  NaN
    4  5  5  NaN
0 голосов
/ 14 ноября 2018

mask + duplicated

Вы можете использовать методы Pandas для маскировки серии:

df['c'] = df['b'].mask(df['b'].duplicated())

print(df)

   a  b    c
0  1  3  3.0
1  2  4  4.0
2  3  3  NaN
3  4  4  NaN
4  5  5  5.0
...