根据另一个值熊猫更新列

时间:2020-09-29 16:25:15

标签: python pandas dataframe data-cleaning

我有已经导出到excel的Questionairre数据。我目前正在尝试清除数据,但是有问题。在调查软件中,它的编号从1.1到1.12,但是当导出到excel时,它从1.10更改为1.1。所以我最终遇到两个问题,都编号为1.1。我希望能够重新编号应为1.10的问题

数据看起来像这样

data = [[1, '1.1', 'first'], 
       [1, '1.2', 'yes'], 
       [1, '1.1', 'daily'],
       [2, '1.1', 'last'], 
       [2, '1.2', 'yes'], 
       [2, '1.1', 'weekly']]

df = pd.DataFrame(data, columns = ['user_id', 'question', 'answer'])

我希望它看起来像这样

data2 = [[1, '1.1', 'first'], 
        [1, '1.2', 'yes'], 
        [1, '1.10', 'daily'],
        [2, '1.1', 'first'], 
        [2, '1.2', 'yes'], 
        [2, '1.10', 'weekly']]
df2 = pd.DataFrame(data2, columns = ['user_id', 'question', 'answer'])

我已经尝试过了

if df[(df.question == '1.1')]:
    if df[(df.answer == 'first')]:
        df.question == '1.1'
    else:
        df.question == '1.10'

但出现此错误

ValueError:DataFrame的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

尝试一下:

df['question'] = df.apply(lambda row: '1.10' if (row['question'] == '1.1' and row['answer'] != 'first') else row['question'], 1)

我们正在做的是使用lambda构建一个函数,该函数接收数据帧的一行,如果问题为1.1而答案不是“ first”,则返回“ 1.10”,然后返回现有问题的价值反之亦然。然后,我们通过将该函数应用于数据框来生成一列,并替换该列中我们已有的问题。

答案 1 :(得分:1)

这应该有效:

df.loc[(df['answer']!='first') & (df['question']=='1.1'),'question'] = '1.10'