ValueError возникла в неожиданном случае - PullRequest
0 голосов
/ 16 июня 2019

Я запустил собственную функцию Python litte и получил неожиданную ошибку ValueError:

Невозможно установить кадр без определенного индекса и значения, которое нельзя преобразовать в серию

Произошла ошибка при вводе определенного значения (0) в один из трех аргументов моей функции (аргумент n_col_num ).

Затем я помещаю в блок комментария ту часть функции, в которой используется аргумент n_col_num , и продолжаю получать ту же ошибку ValueError.

Затем я определил ту часть кода, которая вызывает предупреждение, а именно:

df[ col ] = pd.DataFrame( [ random.choice( rand_val_hat ) for _ in range( n_rows )] )

Для более подробной информации, вот мой код функции:

def rand_df_wrk ( n_col_num , lst_par_col_str , n_rows ) :

    """
     n_col_num : number of numeric columns

     lst_par_col_str : tuple ( a , b ) where a is the number of values in a hat of values and b the number of characters 
                   of each values ( all values are built with the same number of characters )

     n_rows : number of rows in the dataframe
    """

    df = pd.DataFrame()

    if n_col_num > 0 : 
        for i in range( n_col_num ) :
            # name of new numeric column :
            col = 'col_num_' + str( i )
            # values for the new numeric column 
            df[ col ] = np.random.normal( 0 , 1 , n_rows ) 

    if len( lst_par_col_str ) > 0 :  
        for i , par in enumerate( lst_par_col_str ) :
            # name of new string column :
            col = 'col_str_' + str( i )
            # values for sampling with replacement :
            rand_val_hat = rand_str_lst( par[0] , par[1] )
            # values for the new string column :
            df[ col ] = pd.DataFrame( [ random.choice( rand_val_hat ) for _ in range( n_rows )] )

    return df

rand_df_wrk использует следующую функцию:

 def rand_str_lst( N , n ) :

   """
    N : number of string values
    n : number of characters for each string values ( each string value is built with the same number of characters )
   """

   rand_str_lst = []
   for i in range( N ) :
       rand_str_lst.append( rand_str( n ) )
   return rand_str_lst

, а затем rand_str_lst функция использует этот последний:

def rand_str ( n ) :

   """
    n : number of random characters in the returned string
   """

   rand_string = ''.join( random.SystemRandom().choices( string.ascii_uppercase + string.digits , k = n ) )
   return rand_string

( Я не думаю, что две предыдущие функции имеют какое-либо значение для моего случая. )

При вызове, например, функции rand_df_wrk следующим образом:

rand_df_wrk( n_col_num = 2 , lst_par_col_str = [ ( 5 , 3 ) , ( 2 , 1 ) ] , n_rows = 10 )

Я получаю ожидаемый результат (случайный кадр данных, построенный из 2 числовых столбцов, 2 строковых столбцов и 10 строк).

Если я назову это так:

rand_df_wrk( n_col_num = 0 , lst_par_col_str = [ ( 5 , 3 ) , ( 2 , 1 ) ] , n_rows = 10 )

Я получаю значение ошибки, указанное выше.

Это произошло потому, что не был выполнен следующий блок:

if n_col_num > 0 : 
        for i in range( n_col_num ) :
            # name of new numeric column :
            col = 'col_num_' + str( i )
            # values for the new numeric column 
            df[ col ] = np.random.normal( 0 , 1 , n_rows )

Так произошло в следующем блоке моей основной функции:

if len( lst_par_col_str ) > 0 :  
    for i , par in enumerate( lst_par_col_str ) :
        # name of new string column :
        col = 'col_str_' + str( i )
        # values for sampling with replacement :
        rand_val_hat = rand_str_lst( par[0] , par[1] )
        # values for the new string column :
        df[ col ] = pd.DataFrame( [ random.choice( rand_val_hat ) for _ in range( n_rows )] )

А в частности там:

df[ col ] = pd.DataFrame( [ random.choice( rand_val_hat ) for _ in range( n_rows )] )

но я не могу понять, почему, а потом не могу это исправить.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 17 июня 2019

Вот мое решение: вместо

df[ col ] = pd.DataFrame( [ random.choice( rand_val_hat ) for _ in range( n_rows ) ] )

я попытался:

df[ col ] = pd.Series( [ random.choice( rand_val_hat ) for _ in range( n_rows ) ] )

(ср. https://github.com/pandas-dev/pandas/issues/5632)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...