Supongamos que tengo el siguiente marco de datos:
pd.DataFrame({'col1': ["a", "a", np.nan, np.nan, np.nan],
'override1': ["b", np.nan, "b", np.nan, np.nan],
'override2': ["c", np.nan, np.nan, "c", np.nan]})
col1 override1 override2
0 a b c
1 a NaN NaN
2 NaN b NaN
3 NaN NaN c
4 NaN NaN NaN
¿Hay alguna manera de colapsar las 3 columnas en una columna, donde override2
anula override1
, que anula col1
, sin embargo, en caso de que haya NaN, entonces los valores anteriores deben mantenerse? Además, estoy buscando principalmente una forma en la que no tenga que hacer una columna adicional. Realmente estoy buscando una solución de pandas incorporada.
Esta es la salida que estoy buscando:
collapsed
0 c
1 a
2 b
3 c
4 NaN
utilizando ffill
df.ffill(1).iloc[:,-1]
Rendimiento NO en mente sino belleza y elegancia (-:
df.stack().groupby(level=0).last().reindex(df.index)
0 c
1 a
2 b
3 c
4 NaN
dtype: object
Una solución sencilla implica el llenado hacia adelante y la extracción de la última columna. Esto se mencionó en los comentarios.
df.ffill(1).iloc[:,-1].to_frame(name='collapsed')
collapsed
0 c
1 a
2 b
3 c
4 NaN
Si está interesado en el rendimiento, podemos usar una versión modificada de la función de justificación de Divakar:
pd.DataFrame({'collapsed': justify(
df.values, invalid_val=np.nan, axis=1, side='right')[:,-1]
})
collapsed
0 c
1 a
2 b
3 c
4 NaN
Referencia.
def justify(a, invalid_val=0, axis=1, side='left'): """ Justifies a 2D array Parameters ---------- A : ndarray Input array to be justified axis : int Axis along which justification is to be made side : str Direction of justification. It could be 'left', 'right', 'up', 'down' It should be 'left' or 'right' for axis=1 and 'up' or 'down' for axis=0. """ if invalid_val is np.nan: mask = pd.notna(a) # modified for strings else: mask = a!=invalid_val justified_mask = np.sort(mask,axis=axis) if (side=='up') | (side=='left'): justified_mask = np.flip(justified_mask,axis=axis) out = np.full(a.shape, invalid_val, dtype=a.dtype) if axis==1: out[justified_mask] = a[mask] else: out.T[justified_mask.T] = a.T[mask.T] return out
Con enfoque en el rendimiento, aquí hay uno con NumPy:
In [106]: idx = df.shape[1] - 1 - df.notnull().to_numpy()[:,::-1].argmax(1)
In [107]: pd.Series(df.to_numpy()[np.arange(len(df)),idx])
Out[107]:
0 c
1 a
2 b
3 c
4 NaN
dtype: object
Aquí hay un enfoque:
df.lookup(df.index , df.notna().cumsum(1).idxmax(1))
# array(['c', 'a', 'b', 'c', nan], dtype=object)
O, de forma equivalente, trabajar con las numpy
matrices subyacentes y cambiar idxmax
con ndarray.argmax
:
df.values[df.index, df.notna().cumsum(1).values.argmax(1)]
# array(['c', 'a', 'b', 'c', nan], dtype=object)
import pandas as pd
import numpy as np
df=pd.DataFrame({'col1': ["a", "a", np.nan, np.nan, np.nan],
'override1': ["b", np.nan, "b", np.nan, np.nan],
'override2': ["c", np.nan, np.nan, "c", np.nan]})
print(df)
df=df['col1'].fillna('') + df['override1'].fillna('')+ df['override2'].fillna('')
print(df)
Cate Blanchett desafió los consejos típicos sobre citas cuando conoció a su esposo.
Michael Sheen es un actor sin fines de lucro, pero ¿qué significa eso exactamente?
¡La estrella de Hallmark, Colin Egglesfield, habló sobre los emocionantes encuentros con los fanáticos en RomaDrama Live! además de su programa INSPIRE en la convención.
Tendrás que desempolvar un reproductor de Blu-ray o DVD para ver por qué Northern Exposure se convirtió en uno de los programas más populares de los 90.
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
Los recortes de cabello de los salones y las donaciones personales se pueden reutilizar como tapetes que absorben los derrames de petróleo y ayudan a proteger el medio ambiente.
Solo unas pocas personas se han casado en la Casa Blanca en los últimos más de 200 años. ¿Quiénes eran y qué se requiere para marcar una boda allí?
¿Tu boca se emociona al pensar en comer una toronja jugosa? Bueno, frunce el ceño, porque la toronja está repleta de vitaminas y antioxidantes que tu cuerpo necesita.
Los pequeños desarrolladores de aplicaciones obtuvieron $ 90 millones de Google en un acuerdo legal anunciado el viernes, inmediatamente después de un acuerdo similar con Apple. En una publicación de blog el viernes, Google dijo que acordó pagar $ 90 millones para resolver una demanda con los desarrolladores de aplicaciones que afirman que el fabricante de Android abusó de su dominio del mercado para cobrarles injustamente una tarifa del 30% por las compras en la aplicación realizadas a través de Play Store.
Esta semana, la cuenta de Twitter de RadioShack pasó de ser rara a una locura total. En poco tiempo, todo el feed de la compañía se convirtió en un verdadero tesoro de material NSFW, incluidas reflexiones sobre vibradores, "tetas grandes" (mal escritas como las suyas) y tweets que molestaban a celebridades y otras cuentas corporativas.
El detector Compact Muon Solenoid (CMS) en un túnel del Gran Colisionador de Hadrones. El 4 de julio de 2012, los científicos del CERN confirmaron la observación del bosón de Higgs, una partícula elemental propuesta por primera vez en la década de 1960.
¿Eres una de las muchas, muchas personas que sienten un cosquilleo al ver a YouTubers de voz suave tocando y susurrando en sus micrófonos durante horas y horas? ¿Tengo algunas malas vibraciones para ti? Si no te gusta ASMR o nunca has oído hablar de él, aquí hay un resumen rápido: ASMR es la abreviatura de respuesta meridiana sensorial autónoma, y es el nombre de la sensación de la que algunas personas derivan videos de horas de duración de alguien susurrándoles a una cámara.
Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday
La casa de mediados de siglo del ganador del Oscar cuenta con tres dormitorios, dos baños y vistas al mar
"Te sientes tan derrotada cuando tu bebé tiene hambre que no estás produciendo lo suficiente para el bebé", dijo Jeannie Mai Jenkins sobre amamantar a su hija de 4 meses, Monaco.
La pareja de casi 10 años comparte su historia de amor antes de la nueva serie de realidad de A&E Bobby Brown: Every Little Step, que se estrenará el 31 de mayo.
แอพพลิเคชันสมัยนี้หลายๆแอพมักจะมีการยืนยันตัวตนด้วย OTP (One-time password) จาก SMS ซึ่งจะเป็นการบังคับให้ผู้ใช้กรอกเบอร์โทรศัพท์ที่มีอยู่จริงเข้ามาในระบบ แต่ไม่ว่าจะเป็นการพิมพ์เบอร์ หรือการกรอก OTP ที่ต้องรอ SMS เข้า สลับแอพไปดูแล้วจำกลับมากรอก เหล่านี้นั้นสร้างความลำบากให้แก่ผู้ใช้ไม่มากก็น้อย มันคงจะดีถ้าแอพที่เราพัฒนาสามารถ suggest หรือ auto fill ข้อมูลเหล่านี้ให้ผู้ใช้ได้ บทความนี้จึงเป็นขั้นตอนในการพัฒนาระบบยืนยันตัวตนด้วย OTP จาก SMS ซึ่งจะประกอบไปด้วยขั้นตอนการกรอกเบอร์โทรศัพท์ จะมี Hint เป็นเบอร์จาก sim ขึ้นมาให้ผู้ใช้เลือก และใส่ OTP ที่ได้จาก SMS โดยที่ตัวแอพจะไปอ่านเฉพาะ SMS ที่แอพได้รับอนุญาตเอามาใส่ใน input ให้เอง รูปแบบของข้อความ SMS ตั้งแต่ Android M เป็นต้นมา Google อนุญาตให้แค่แอพเดียวสามารถอ่านและจัดการ SMS ซึ่งคนทั่วไปมักตั้งค่าให้เป็นแอพข้อความของเครื่องอยู่แล้ว โดย Google ได้ออกตัว SMS Retriever API มาแทน เพื่อให้แอพสามารถอ่านข้อความจาก SMS ได้แต่ต้องเป็น SMS ที่ถูกยิงมาจาก Server ที่แอพได้รับอนุญาตให้อ่านเท่านั้น ข้างล่างคือรูปแบบที่ข้อความต้องส่ง Step 1: Import library สร้างหน้าสำหรับให้ผู้ใช้กรอกเบอร์โทรศัพท์ขึ้นมาและใส่ code ต่อไปนี้ เมื่อต้องการให้แอพแสดง hint เบอร์โทรศัพท์ ให้เรียกฟังก์ชัน requestNumber() ได้เลย จะมี BottomSheet เด้งขึ้นมาดังภาพด้านล่าง เมื่อผู้ใช้กดเลือกเบอร์ ให้เราไปเพิ่ม logic สำหรับแสดงเบอร์โทรศัพท์ใน result ของ launcher Step 3: สร้าง SMS Broadcast Receiver ให้สร้าง BroadcastReceiver สำหรับรับ SMS ขึ้นมา จากโค๊ดด้านบน หากสามารถแกะข้อความจาก SMS สำเร็จจะมีการใช้ regex หาเลขที่ติดกัน 6 ตัวออกมา หากตรงตามเงื่อนไขจะมีการเรียก callback onOTPReceived หากต้องการเปลี่ยน pattern การแกะ otp จากข้อความสามารถเปลี่ยน regex ได้ที่บรรทัด 27 Step 4: สร้างหน้าสำหรับใส่ OTP ใส่ฟังก์ชันสำหรับ initiate SMS retrieval task หลังจากนั้นให้สร้าง instance ของ SMSBroadcastReceiver ขึ้นมา set ตัว listener ให้เรียบร้อย และสุดท้ายก็จัดการแสดงผล OTP ที่แกะออกมาได้จากฟังก์ชัน onOTPReceived Step 6: Register SMSBroadcastReceiver เมื่อมีไฟล์ BroadcastReceiver แล้วมันจะยังทำงานไม่ได้ให้เราไป register มันใน AndroidManifest เสียก่อน โดยใส่ intent filter com.google.
Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.
Bem, poderia começar este artigo de várias formas, mas vamos do início: meu primeiro trabalho efetivo numa startup. Na época (há quase 3 anos), não era muito reconhecido pelo nome de Customer Success.