创建基于NaN映射的1s和0s的键列

Bartek Nowakowski

我有一个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
安塞夫

DataFrame.notnaDataFrame.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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章