一列中的值基于另一列中的条件

时间:2019-05-29 12:08:33

标签: python pandas dataframe

我有一个数据框:

Data = {'group':  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'],
        'value1': [2, 0, 0, 5, 5, 5, 6, 31, 7, 5, 0, 99],
        'value2': [25, 12 ,15, 11, 36, 3, 65, 6, 89, 8, 74, 5]
        }

current_result = pd.DataFrame(Data, columns = ['group','value1', 'value2'])

如果相应的value2等于零,我想将value1设置为零,同时保持所有其他值相同。所以我想要的结果是:

Data = {'group':  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'],
        'value1': [2, 0, 0, 5, 5, 5, 6, 31, 7, 5, 0, 99],
        'value2': [25, 0 ,0, 11, 36, 3, 65, 6, 89, 8, 0, 5]
        }

current_result = pd.DataFrame(Data, columns = ['group','value1', 'value2'])

我该怎么办?

6 个答案:

答案 0 :(得分:2)

使用df.loc[]

current_result.loc[current_result.value1.eq(0),'value2']=current_result.value1
print(current_result)

   group  value1  value2
0      a       2      25
1      b       0       0
2      c       0       0
3      d       5      11
4      e       5      36
5      f       5       3
6      g       6      65
7      h      31       6
8      i       7      89
9      j       5       8
10     k       0       0
11     l      99       5

答案 1 :(得分:2)

您可以乘以布尔掩码-True1之类的进程,False0之类的进程,因此用{{3}比较不等于0 }:

current_result['value2'] *= current_result['value1'].ne(0)
print (current_result)
   group  value1  value2
0      a       2      25
1      b       0       0
2      c       0       0
3      d       5      11
4      e       5      36
5      f       5       3
6      g       6      65
7      h      31       6
8      i       7      89
9      j       5       8
10     k       0       0
11     l      99       5

答案 2 :(得分:1)

使用此:

current_result.loc[current_result['value1'] == 0, ['value2']] = 0

答案 3 :(得分:0)

current_result.loc[current_result['value1'] == 0, 'value2'] = 0

答案 4 :(得分:0)

不使用任何Pandas核心功能,此循环即可完成工作:

for index, value in enumerate(current_result["value1"]):
    if value == 0:
        current_result["value2"][index] = 0

答案 5 :(得分:0)

def change_value(row):
    if row.value1 == 0:
        row.value2 = 0
    return row


current_result = current_result.apply(change_value, axis=1)