Создайте ключевой столбец 1 & 0, сопоставленный на основе NaN - PullRequest
1 голос
/ 11 февраля 2020

У меня есть DataFrame, как показано ниже:

df
      A    B     C    D    E
0  test  NaN  10.0    a    a
1  test  NaN  10.0    a    a
2  test    x   NaN    a  NaN
3  test  NaN  12.0  NaN  NaN
4  test    x   NaN  NaN  NaN
5  test  NaN  14.0    g    c

Я хочу создать столбец key, который:

  • - это строка длины == len(df.columns)
  • каждый 0 представляет NaN, а каждый 1 представляет не NaN
      A    B     C    D    E    key
0  test  NaN  10.0    a    a  10111
1  test  NaN  10.0    a    a  10111
2  test    x   NaN    a  NaN  11010
3  test  NaN  12.0  NaN  NaN  10100
4  test    x   NaN  NaN  NaN  11000
5  test  NaN  14.0    g    c  10111

Я знаю, как это проверить, но не знаю, как чтобы получить его в 1 строку в 1 столбце. Мой текущий код:

for col in df.columns:
...     print(df[col].isnull().astype(int).replace({1: 0, 0: 1}))
...     
0    1
1    1
2    1
3    1
4    1
5    1
Name: A, dtype: int64
0    0
1    0
2    1
3    0
4    1
5    0
Name: B, dtype: int64
0    1
1    1
2    0
3    1
4    0
5    1
Name: C, dtype: int64
0    1
1    1
2    1
3    0
4    0
5    1
Name: D, dtype: int64
0    1
1    1
2    0
3    0
4    0
5    1
Name: E, dtype: int64
0    1
1    1
2    1
3    1
4    1
5    1
Name: key, dtype: int64

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Используйте DataFrame.notna с DataFrame.astype и DataFrame.apply:

df['key']=df.notna().astype(int).astype(str).apply(''.join,axis = 1)
#df['key']=df.notnull().astype(int).astype(str).apply(''.join,axis = 1)
print(df)
      A    B     C    D    E    key
0  test  NaN  10.0    a    a  10111
1  test  NaN  10.0    a    a  10111
2  test    x   NaN    a  NaN  11010
3  test  NaN  12.0  NaN  NaN  10100
4  test    x   NaN  NaN  NaN  11000
5  test  NaN  14.0    g    c  10111

Другой подход: DataFrame.replace

df['key'] = df.notna().replace({True:'1',False:'0'}).apply(''.join,1)

или

df['key'] =  df.notna().astype(int).astype(str).stack().groupby(level=0).agg(''.join)
2 голосов
/ 11 февраля 2020

с использованием numpy и списком

df['key'] = [''.join(x) for x in np.where(df.isnull(),'0','1')]

print(df)

      A    B     C    D    E    key
0  test  NaN  10.0    a    a  10111
1  test  NaN  10.0    a    a  10111
2  test    x   NaN    a  NaN  11010
3  test  NaN  12.0  NaN  NaN  10100
4  test    x   NaN  NaN  NaN  11000
5  test  NaN  14.0    g    c  10111
...