Столбец Python сохраняет оригинальное обновленное «NA»;никогда не обновляется с помощью float - PullRequest
0 голосов
/ 22 ноября 2018

При обновлении столбца dataframe, FractionOfVote, моим первым шагом было добавление нового столбца, FractionOfVote, со значением NA по умолчанию.Затем проанализируйте столбец dataframe, Votes, используя split.

Работает следующий код двух функций: 1) add_new_column_fraction (), 2) add_new_column_votes ().

def add_new_column_fraction(df):
    df['FractionOfVote'] = 'NA'

def add_new_column_votes(df):
    df[['YesVotes','NumVotes']] = df['Votes'].str.split('/',expand=True)[[0,1]]

Код проблемы находится в функции calc_fraction_ratio_for_votes ()

def calc_fraction_ratio_for_votes(df):
    for idx, row in df.iterrows():
        numerator = row['YesVotes']
        denomerator = row['NumVotes']
        try:
            row['FractionOfVote'] = float(numerator) / float(denomerator)
        except ZeroDivisionError:
            row['FractionOfVote'] = 'NaN'

Эта функция принимает два других столбца данных, YesVotes, NumVotes, и вычисляет новое значение с плавающей запятой для нового столбца, FractionOfVote, определенное ранее в add_new_column_fraction ().

Логическая ошибка заключается в том, что в столбце FractionOfVote сохраняется исходное обновленное значение «NA»;и никогда не получал обновление от «row ['FractionOfVote'] = float (числитель) / float (деномератор)» с вычислением значения с плавающей запятой или с «NaN» из «кроме ZeroDivisionError».

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Почему вы используете iterrrows() в первую очередь?Вы можете добиться тех же результатов с векторизованной реализацией, как показано ниже:

 # Create column and fill all values to NaN by default
 df['FractionOfVote'] = np.nan # import numpy as np if you didn't

 # Populate the valid values with the ratio.
 df.loc[df['NumVotes'].astype(float) > 0, 'FractionOfVote'] = df['YesVotes'] / df['NumVotes'] 
0 голосов
/ 22 ноября 2018

Вы должны стараться избегать петель уровня Python.Сначала убедитесь, что ваша серия числовая (при необходимости):

df = pd.DataFrame({'Yes': [0, 3, 0, 10, 0],
                   'Num': [0, 5, 0, 30, 2]})

num_cols = ['Yes', 'Num']
df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce')

Затем используйте деление и замените inf на NaN:

print((df['Yes'] / df['Num']).replace(np.inf, np.nan))

0         NaN
1    0.600000
2         NaN
3    0.333333
4    0.000000
dtype: float64
...