как использовать переменную, представляющую условия в np.where для столбца в pandas со значениями списка? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь использовать np.where для вычислений внутри столбца на основе других условий. И я использую sh, чтобы изменить условие else. Также мне нужно использовать ** df1 ['match']. Fillna ('[0]', inplace = True) **, иначе это давало другую ошибку

Код:

df1 = pd.read_csv('one.txt',sep = '\t')
df1['matches'].fillna('[0]',inplace = True) 
df1['scorehigh?']  = df1['league'].apply(lambda a: 'yes' if a == 'Active' or a == 'Super Active' else 'no')
df1['greaterthan10?'] = (['yes' if any(int(a)>10 for a in i) else 'no' 
                                      for i in df1['matches'].str.findall('\d+')])

m=np.where((df1['scorehigh?']=='yes')) & (df1['matches'] != '[0]')                    

df1['Finals?']  = np.where((df1['scorehigh?']=='yes') & (df1['greaterthan10?'] == 'yes'), 'YES', m)
a=df1['Finals?'].value_counts()
print(a)

Ошибка:

setting an array element with a sequence.

Ввод:

league          matches
Active          [[1, 0, 50,], [2, 0, 14,]]
Active          [[1, 0, 0,], [2, 0, 4,]]
Active          [[1, 0, 50,], [2, 0, 14,]]
Super Active    [[1, 0, 50,], [2, 0, 14,]]
Low             [[1, 0, 50,], [2, 0, 14,]]
Low             [[1, 0, 5,], [2, 0, 5,]]
Low             [[1, 0, 40,], [2, 0, 10,]]
Super Active    
Super Active    
Super Active    
Super   
Low 

Ожидаемый результат:

league               matches                                   greater_than_10?
Active               [[1, 0, 50,], [2, 0, 14,]]                yes
Active               [[1, 0, 0,], [2, 0, 4,]]                  no
Active               [[1, 0, 50,], [2, 0, 14,]]                yes
Super Active         [[1, 0, 50,], [2, 0, 14,]]                yes
Low                  [[1, 0, 50,], [2, 0, 14,]]                no
Low                 [[1, 0, 5,], [2, 0, 5,]]                   no
Low                 [[1, 0, 40,], [2, 0, 10,]]                 no
Super Active           [0]                                     no
Super Active           [0]                                     no
Super Active           [0]                                     no
Super                  [0]                                     no
Low                    [0]                                     no

Ожидаемый После использования value.counts :

Yes: 3
No: 4

1 Ответ

1 голос
/ 17 июня 2020

Проблема с:

m=np.where((df1['scorehigh?']=='yes')) & (df1['matches'] != '[0]')

Если параметр после выхода маски не является массивом позиций совпадающих значений.


df1['matches'].fillna('[0]',inplace = True) 


df1['scorehigh?']  = df1['league'].apply(lambda a: 'yes' if a == 'Active' or a == 'Super Active' else 'no')
df1['greaterthan10?'] = (['yes' if any(int(a)>10 for a in i) else 'no' 
                                      for i in df1['matches'].str.findall('\d+')])

Используйте вложенные numpy.where с указанием None, если совпадений нет, также для второй маски использовалась только df1['matches'] != '[0]':

df1['Finals?'] = np.where((df1['scorehigh?']=='yes')&(df1['greaterthan10?'] == 'yes'), 'YES',
                 np.where(df1['matches'] != '[0]', 'NO', None))

Или numpy.select:

df1['Finals?'] = np.select([(df1['scorehigh?']=='yes')&  (df1['greaterthan10?'] == 'yes'), 
                            df1['matches'] != '[0]'], ['YES', 'NO'], default=None)

print (df1)
          league                     matches scorehigh? greaterthan10? Finals?
0         Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
1         Active    [[1, 0, 0,], [2, 0, 4,]]        yes             no      NO
2         Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
3   Super Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
4            Low  [[1, 0, 50,], [2, 0, 14,]]         no            yes      NO
5            Low    [[1, 0, 5,], [2, 0, 5,]]         no             no      NO
6            Low  [[1, 0, 40,], [2, 0, 10,]]         no            yes      NO
7   Super Active                         [0]        yes             no    None
8   Super Active                         [0]        yes             no    None
9   Super Active                         [0]        yes             no    None
10         Super                         [0]         no             no    None
11           Low                         [0]         no             no    None

a=df1['Finals?'].value_counts()
print(a)
NO     4
YES    3
Name: Finals?, dtype: int64

Если используются оба вывода условий, разные:

df1['Finals?'] = np.select([(df1['scorehigh?']=='yes')&  (df1['greaterthan10?'] == 'yes'), 
                            (df1['scorehigh?']=='yes') & (df1['matches'] != '[0]')], 
                            ['YES', 'NO'], default=None)
print (df1)
          league                     matches scorehigh? greaterthan10? Finals?
0         Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
1         Active    [[1, 0, 0,], [2, 0, 4,]]        yes             no      NO
2         Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
3   Super Active  [[1, 0, 50,], [2, 0, 14,]]        yes            yes     YES
4            Low  [[1, 0, 50,], [2, 0, 14,]]         no            yes    None
5            Low    [[1, 0, 5,], [2, 0, 5,]]         no             no    None
6            Low  [[1, 0, 40,], [2, 0, 10,]]         no            yes    None
7   Super Active                         [0]        yes             no    None
8   Super Active                         [0]        yes             no    None
9   Super Active                         [0]        yes             no    None
10         Super                         [0]         no             no    None
11           Low                         [0]         no             no    None

a=df1['Finals?'].value_counts()
print(a)
YES    3
NO     1
Name: Finals?, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...