计算pandas中的新列

时间:2015-11-15 05:40:43

标签: python python-3.x pandas ipython-notebook

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

这是我尝试过的代码:

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'])

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

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

这是因为您正在针对系列x操作元素va2['pct_vote']。您需要的是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