首页 > 解决方案 > 将 lambda 函数动态应用于列

问题描述

我有一个谷歌表,其中某些答案不在正确的位置。

实际上,我希望对于每一行,给定最后一列中的答案,如果答案尚未在 Answeri 列中,我们将这个答案移到第一列的左侧,即无。

也就是说得到这样的东西:

    Questions   Answer0     Answer1     Answer2     Answer3     Answer4    Answer6
3   What is your preference for a in-hotel grocery...   'Not preferred'     2   3   4   'Preferred'    None
58  3 - If yes, on a scale of 0 -10, to what exten...   'Low affected'  2   3   4    5    'High affected' 

到目前为止,我已经写了这个:

import pandas as pd

def put_at_right_place(row):
    if row.Answer257 not in [None, np.nan]:
        answer = row.Answer257
        if answer not in row.Answer0:
            for i in range(0,257):
                # on choppe la premiere colonne qui n'est pas None
                if row[f'Answer{i}']== None:
                    index_to_replace = 'Answer' + str(i-1)
                    row[index_to_replace] = row.Answer257

df = pd.read_csv('la_hoja_del_vinclulo.csv')
df.apply(lambda x: put_at_right_place(x), axis=1) 

就像在 Google 表格中一样,我也很乐意尝试使用 Javascript 编辑器。

标签: javascriptpythonpython-3.xgoogle-sheets

解决方案


既然我认为它的最终目标是实际分析数据......;)

我会融化你的df:

unique_cols = ["QID_x","URL_x","Questions", 
               "Answers_x","Section","QType_x",
               "Theme","Topics"]
results = df.melt(id_vars=unique_cols, 
                  var_name="Answer", 
                  value_name="Value")
results = results[pd.notnull(results["Value"])]

您现在可以轻松分析每个问题:

results[results.QID_x == 1]

融化后,您可以返回并执行以下操作:

results.sort_values(by='Answer').pivot(index="QID_x", columns='Answer', values='Value')

然后重新加入(pd.merge)与初始帧(没有答案)。


推荐阅读