Панды: перебрать строку и добавить значение в пустой столбец - PullRequest
0 голосов
/ 31 декабря 2018

Здравствуйте, я хотел бы перебрать строку CPB% и добавить вычисления в связанный столбец с именем «Proba».Мой фрейм данных выглядит так: enter image description here

То, что я пробовал до сих пор, выглядит так:

bins = np.linspace(0, 1, num=100)
dCPB = df['CPB%']
df['binnedB'] = pd.cut(dCPB, bins)
dfnew = pd.DataFrame(pd.cut(df['CPB%'], bins=bins).value_counts()).sort_index(ascending = True)
dfnew['binned'] = dfnew.index

total = dfnew['CPB%'].sum()
idx = total

for index,row in dfnew.iterrows():
  idx = idx - row['CPB%']
  row['Proba'] = float(idx) / float(total)

Но моя итерация не обновляет мой пустой столбец Proba,есть идеи почему?Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете использовать pd.Series.cumsum для выполнения итеративных вычетов:

total = dfnew['CPB%'].sum()
dfnew['Proba'] = 1 - df['CPB%'].cumsum() / total

С Pandas вы должны искать векторизованные алгоритмы, которые обычно включаютмудрые операции, а не строковый цикл for.Вот полная демонстрация:

df = pd.DataFrame({'A': list(range(1, 7))})

def jpp(df):
    total = df['A'].sum()
    df['Proba'] = 1 - df['A'].cumsum() / total
    return df

def yolo(df):
    total = df['A'].sum()
    idx = total

    proba = []
    for index, row in df.iterrows():
        idx = idx - row['A']
        proba.append(float(idx) / float(total))

    df['Proba'] = proba
    return df

# check results are the same
assert df.pipe(jpp).equals(df.pipe(yolo))

%timeit df.pipe(jpp)   # 691 µs
%timeit df.pipe(yolo)  # 840 µs
0 голосов
/ 31 декабря 2018

Я думаю, проблема в том, что вы присваиваете результат обратно row, который нигде не сохраняется.вместо этого вы можете сделать:

proba = []

for index, row in dfnew.iterrows():
    idx = idx - row['CPB%']
    proba.append(float(idx) / float(total))

dfnew['Proba'] = proba

Однако это не лучший способ, вы можете использовать .apply с axis=1 для выполнения построчных вычислений во фрейме данных.

...