正在计算 pandas 中的新列

Calculating a new column in pandas

我有一个历史选举结果的数据框,我想计算一个额外的列,该列对获胜候选人的记录应用基本数学公式,并为其余候选人复制一个值。

这是我试过的代码:

va2 = va1[['contest_id', 'year', 'district', 'office', 'party_code', 
           'pct_vote', 'winner']].drop_duplicates()
va2['vote_waste'] = va2['winner'].map(lambda x: (-.5) + va2['pct_vote'] 
                       if x == 'w' else va2['pct_vote'])

这给了我一个新列,其中每一行包含每一行中每一行的计算。

这是因为您正在对系列 va2['pct_vote'] 操作元素 x。您需要的是对 va2['winner']va2['pct_vote'] 元素进行操作。您可以使用 apply 来实现。

a 视为 winner,将 b 视为 pct_vote

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])

df
Out[23]: 
   a  b  c
0  1  2  3
1  4  5  6


df['new'] = df[['a','b']].apply(lambda x : (-0.5)+x[1] if x[0] ==1 else x[1],axis=1)

df
Out[42]: 
   a  b  c  new
0  1  2  3  1.5
1  4  5  6  5.0

你可以使用numpy.where()来实现你想要的:

import pandas as pd
import numpy as np

data = {
    'winner': pd.Series(['w', 'l', 'l', 'w', 'l']),
    'pct_vote': pd.Series([0.4, 0.9, 0.9, 0.4, 0.9]),
    'party_code': pd.Series([10, 20, 30, 40, 50])
}

df = pd.DataFrame(data)
print(df)

   party_code  pct_vote winner
0          10       0.4      w
1          20       0.9      l
2          30       0.9      l
3          40       0.4      w
4          50       0.9      l

df['vote_waste'] = np.where(
        df['winner'] == 'w', 
        df['pct_vote'] - 0.5,   #if condition is true, use this value
        df['pct_vote']          #if condition is false, use this value
)

print(df)

   party_code  pct_vote winner  vote_waste
0          10       0.4      w        -0.1
1          20       0.9      l         0.9
2          30       0.9      l         0.9
3          40       0.4      w        -0.1
4          50       0.9      l         0.9