Saya ingin dengan mudah membagi kolom saya menjadi dua (atau lebih) menggunakan apply. (Saya bisa menggunakan split seperti yang mereka lakukan di sini, tapi di sana pengecualian yang akan sulit untuk ditangani. Jawaban ini serupa, tetapi lagi menghasilkan satu kolom.

import pandas as pd

df = pd.DataFrame({"xVal":[1,2,7,4], "xRef":["1-2","2-3",">4", "NoReference"]})

def sep_ref(row):
    if '-' in row:
        return row.split("-")
    else:
        # handle and return some list
        return [row, row]

# broken assinment
df['xlow'], df['xhigh'] = df.xRef.apply(sep_ref)

Df

   xVal            xRef
0     1           '1-2'
1     2           '2-3'
2     7            '>4'
3     4   'NoReference'

Keluaran yang diinginkan

   xVal  xlow  xhigh
0     1     1      2
1     2     2      3
2     7     4    NaN
3     4   NaN    NaN

Solusi mudahnya adalah menjalankan dua fungsi apply yang terpisah, tetapi ini kurang elegan dan dapat membuat penanganan pengecualian menjadi lebih sulit. Apakah ada cara untuk menambahkan 2 kolom sekaligus dengan apply?

1
rocket_brain 8 Agustus 2019, 06:45

1 menjawab

Jawaban Terbaik

PERBARUI:

Saya baru saja memperhatikan preferensi NaN. Berikut adalah perbaikannya:

import pandas as pd
import numpy as np

df = pd.DataFrame({"xVal":[1,2,7,4], "xRef":["1-2","2-3",">4", "NoReference"]})

def sep_ref(row):
    if '-' in row:
        return [int(x) for x in row.split("-")]
    elif row.startswith('>'):
        return [int(row[1:]), np.nan]
    elif row.startswith('<'):
        return [np.nan, int(row[1:])]
    else:
        return [np.nan, np.nan]

# not broken assinment
df['xlow'] = None
df['xhigh'] = None
df[['xlow', 'xhigh']] = [*df.xRef.apply(sep_ref)]
print(df)
   xVal         xRef  xlow  xhigh
0     1          1-2   1.0    2.0
1     2          2-3   2.0    3.0
2     7           >4   4.0    NaN
3     4  NoReference   NaN    NaN

ASLI:

Untuk melakukan ini, saya pikir Anda perlu menginisialisasi kolom "xlow" dan "xhigh" terlebih dahulu.

# not broken assignment
df['xlow'] = None
df['xhigh'] = None
df[['xlow', 'xhigh']] = [*df.xRef.apply(sep_ref)]
print(df)

Keluaran:

   xVal         xRef         xlow        xhigh
0     1          1-2            1            2
1     2          2-3            2            3
2     7           >4           >4           >4
3     4  NoReference  NoReference  NoReference
1
brentertainer 8 Agustus 2019, 04:10