在Python中循环:根据其他列中的值修改一列

时间:2018-06-22 15:35:58

标签: python pandas loops if-statement

当前数据:

存储为Pandas DataFrame

print(df)

col1 | col2 
A    | 1
B    | 3
C    | 3
D    | 7
E    | 4
C    | 3

目标:

我要创建一个新列,如果col1是A,C或E,则向col2加1。

col1 | col2  | col2_corrected
A    | 1     | 2
B    | 3     | 3
C    | 3     | 4
D    | 7     | 7
E    | 4     | 5
C    | 3     | 4

我失败的解决方案:

add_one_to_me = ['A','C','E']

if df.col1.isin(add_one_to_me):
    df.col2_corrected = df.col2 + 1
else: df.col2_corrected = df.col2

这会引发关于模棱两可的真理的错误,因为它正在评估整个系列的真理。

如何将其应用于DataFrame的每一行?我是Python和编程的新手,所以这是一个非常基本的问题。

提前谢谢!

3 个答案:

答案 0 :(得分:3)

# Copy the existing column over
df['col2_corrected'] = df.col2

# Increment the values of only those items where col1 is A C or E
df.loc[df.col1.isin(['A', 'C', 'E']), 'col2_corrected'] += 1

df
Out[]: 
  col1  col2  col2_corrected
0    A     1               2
1    B     3               3
2    C     3               4
3    D     7               7
4    E     4               5
5    C     3               4

出现该错误的原因是从if df.col1.isin(add_one_to_me):

开始

如果我们看一下:df.col1.isin(add_one_to_me)

Out[]: 
0     True
1    False
2     True
3    False
4     True
5     True

这并不意味着if语句。您本可以做的是反复检查col1中的每个项目,然后将col2_corrected递增1。这可以通过使用df.apply(...)for index, row in df.iterrows():

来完成

答案 1 :(得分:2)

您可以使用True的整数值为1的事实

df['col2_corrected'] = df['col2'] + df['col1'].isin(add_one_to_me)

答案 2 :(得分:0)

您也可以使用map的功能,即

df['new'] = df['col1'].map({'A':1,'C':1,'E':1}).fillna(0) + df['col2']

   col1  col2  new
0    A     1  2.0
1    B     3  3.0
2    C     3  4.0
3    D     7  7.0
4    E     4  5.0
5    C     3  4.0