Saya mencoba menggunakan numpy.select untuk mengganti nilai tertentu dengan nilai lain di kolom DataFrame pandas.

df = pd.DataFrame({'col':['a','b','c', np.nan, 'a or b', 'bad or good', 'a;b']})

Output yang saya inginkan:

array(['x', 'b', 'c', np.nan, 'a', 'bad', 'x'])

Saya menggunakan kode berikut untuk melakukannya:

np.select(condlist = [df['col']=='a', 
                      df['col'].str.contains(';', na=False), 
                      df['col'].str.contains('or', na=False)
                     ],
          choicelist = ['x', 
                        'x', 
                        df['col'].str.split(' or')[0]
                       ],
          default = df['col']
         )

Tapi itu memunculkan ValueError:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

Saya pikir masalahnya ada pada df['col'].str.split(' or')[0] karena ketika saya menghapus opsi ini dan kondisi yang sesuai, sisa kode berfungsi. Bagaimana saya melanjutkan dari sini?

0
NewbieAF 30 Desember 2020, 04:47

3 jawaban

Jawaban Terbaik

Ayo kita coba

df['out'] = df.col.str.split('or|;').str[0].str.strip()
0      a
1      b
2      c
3    NaN
4      a
5    bad
6      a
Name: col, dtype: object
1
BENY 30 Desember 2020, 02:03

Saya akan mengganti df['col'].str.split(' or')[0]

Dengan

temp = [s.split(' or')[0] for s in df['col'].values]

Penting bahwa None atau np.nan atau apa pun, ditempatkan dalam daftar jika tidak mengandung ' atau'. Saya tidak yakin apakah pemahaman daftar di atas melakukan itu (Anda dapat memeriksanya sendiri - dan perbaiki jika tidak).

choicelist = ['x', 
              'x', 
              temp]

Tidak yakin apakah itu akan berhasil tetapi Anda bisa mencobanya

1
MaxYarmolinsky 30 Desember 2020, 02:12

Ganti df['col'].str.split(' or')[0] dengan df['col'].str.split(' or').str[0]:

np.select(condlist = [df['col']=='a', 
                      df['col'].str.contains(';', na=False), 
                      df['col'].str.contains('or', na=False)
                     ],
          choicelist = ['x', 
                        'x', 
                        df['col'].str.split(' or').str[0]
                       ],
          default = df['col']
         )``

df['col'].str.split(' or')

0             [a]
1             [b]
2             [c]
3             NaN
4         [a,  b]
5    [bad,  good]
6           [a;b]
Name: col, dtype: object


df['col'].str.split(' or')[0] always -> ['a']


df['col'].str.split(' or').str[0]

0      a
1      b
2      c
3    NaN
4      a
5    bad
6    a;b
Name: col, dtype: object
1
Ferris 30 Desember 2020, 03:51