Saya memiliki Panda DataFrame yang terlihat seperti ini:

df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})

Dan saya ingin mengulangi setiap baris, periksa nilai 'TOTAL_COVERAGE' dan jika 'ya', lakukan operasi matematika pada nilai lainnya, yaitu:

for index, row in df.iterrows():
    df['%']  = df.apply(lambda x : ((int(x['END_S'])*100)/int(x['END_D'])) if x['TOTAL_COVERAGE'] == 'yes' else '')

Tapi saya mendapatkan kesalahan: KeyError: 'TOTAL_COVERAGE' Pasti ada perbaikan mudah yang tidak saya lihat. Terima kasih sebelumnya!

0
JuanMacD 11 Januari 2021, 00:47

3 jawaban

Jawaban Terbaik

Anda dapat menyelesaikannya dalam pendekatan vektor, tidak perlu iterrows dan apply:

df['%'] = (df['END_S'].astype(int) * 100 / df['END_D'].astype(int)) \
            .where(df['TOTAL_COVERAGE'] == 'yes')

df

#       ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S      %
#0  O60829            yes     1   102     1   102  100.0
#1  O60341            yes     1    25     1    25  100.0
#2  Q9H1R3             no   500   600     1   458    NaN

Alasan Anda mendapatkan keyError adalah karena saat Anda menggunakan apply, argumen ke lambda x adalah kolom (Seri panda), yang tidak dapat digunakan untuk mengakses kolom tertentu dengan namanya .

2
Psidom 10 Januari 2021, 22:26

Anda dapat melakukannya tanpa iterrows dan apply, dengan menyamakan secara langsung:

df['%'] = ''
df.loc[df['TOTAL_COVERAGE'] == 'yes', '%'] = 
    df['END_S'].astype(int) * 100 / df['END_D'].astype(int)
3
Michael O. 10 Januari 2021, 22:32

Tidak perlu melakukan iterrows(). Logika kondisional dapat dilakukan dengan numpy.where() untuk memberikan solusi yang jauh lebih efisien

df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'], 'TOTAL_COVERAGE' : ['yes','yes','no'], 'BEG_D' : ['1','1','500'], 'END_D' : ['102','25','600'], 'BEG_S' : ['1','1','1'], 'END_S': ['102','25','458']})
df = (df
 .assign(pct=lambda x: np.where(x["TOTAL_COVERAGE"].eq("yes"),(x['END_S'].astype(int)*100)/x['END_D'].astype(int), np.nan))
 .rename(columns={"pct":"%"})
)

Keluaran

     ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S      %
 O60829            yes     1   102     1   102  100.0
 O60341            yes     1    25     1    25  100.0
 Q9H1R3             no   500   600     1   458    NaN
2
Rob Raymond 10 Januari 2021, 22:35