Saya memiliki df seperti ini

   a  b  number 
0  s  d   100   
1  v  f  np.nan
2     e   10  
3  d  e      

Saya ingin df seperti ini

   a  b  number   status     Invalid
0  s  d   100      Valid       False  
1  v  f  np.nan    Not valid   True
2     e   10       Not valid   True
3  d  e            Not valid   True

Untuk kondisi ini adalah jika nilai angka >=1 maka dan A hanya berisi ['S','V'] maka =Tidak Valid Benar dan jika a/angka berisi kosong/NaN maka ini Tidak Valid Benar dan

Saya mencoba dengan ini:

def check(df):
    if ((df['a'] in (['S','V'])) & ((df['number'])>=1)):
        return (True,'Not Valid')
    elif (df[['a','number']].isnull()).any()\
                or (df[['a','number']] == '').any():
        return (True,'Not Valid')
    else:
        return (False , "Valid")
df[['Invalid','Status']] = df.apply(check, axis = 1).tolist()

Saya mencoba dengan kode di atas tetapi saya mendapatkan kesalahan seperti

TypeError: '>=' not supported between instances of 'str' and 'int'

Kapan pun Nomor kosong atau Nan

1
user14784453 25 Mei 2021, 13:04

1 menjawab

Jawaban Terbaik

Saya mengubah beberapa keluaran dari return untuk keluaran yang diharapkan:

#changed df to x for more clear x is row, not DataFrame
def check(x):
    #for scalar is used and instead &
    if ((x['a'] in (['s','v'])) and ((x['number'])>=1)):
        return (False,'Valid')
    elif (x[['a','number']].isnull()).any()\
                or (x[['a','number']] == '').any():
        return (True,'Not Valid')
    else:
        return (True , "Not Valid")
    
#converted column to numeric, if some non numeric values are generated NaNs
df['number'] = pd.to_numeric(df['number'], errors='coerce')
df[['Invalid','Status']] = df.apply(check, axis = 1).tolist()

print (df)
   a    b  number  Invalid     Status
0  s    d   100.0    False      Valid
1  v    f     NaN     True  Not Valid
2  e  NaN    10.0     True  Not Valid
3  d    e     NaN     True  Not Valid
1
jezrael 25 Mei 2021, 10:10