【问题标题】:Python: Create New Fields in Dataframe Efficiently Based on Values in Existing FieldsPython:根据现有字段中的值有效地在数据框中创建新字段
【发布时间】:2017-07-03 00:20:20
【问题描述】:

目前,我有以下数据框表:

这是我要创建的表(所需的列以黄色突出显示):

下面是我想在代码中实现的逻辑:

  • 为表中的每个现有列创建一个新列,并将_Weight 添加到列名。
  • 如果列值不为空,则为不为空的每一行分配一定数量的点(在我的示例中,50 分配给 Advisor_Weight 列,100 分配给其他列)。

我知道如何以缓慢/低效的方式执行此操作,我使用 np.where 类型的语句手动创建每个新列。

我想知道......有没有一种有效的循环方式来做到这一点?任何帮助是极大的赞赏!

【问题讨论】:

    标签: python loops pandas dataframe field


    【解决方案1】:

    如果你在 Pandas DataFrame 中有这些数据,那真的很简单:

    这是我的示例 df:

    df = pd.DataFrame([[np.NaN, np.NaN, np.NaN],['Significant',np.NaN, np.NaN],[np.NaN, "Yes", np.NaN], ["Significant", np.NaN, "Top Advisor"]], columns=['Advisor', 'Retirement', 'Recognition'])
    

    columns_50_points = [df.columns[0]]
    columns_100_points = df.columns[1:]
    
    for col in columns_50_points:
        df[col+"_Weight"] = ~df[col].isnull() * 50
    
    for col in columns_100_points:
        df[col+"_Weight"] = ~df[col].isnull() * 100
    

    首先,我通过将哪些列分配给其中一个列表来指定它们的价值。

    ~df[col].isnull() 这会检查值是否不为空,如果为真则乘以你的体重。

    之后 DataFrame 如下所示:

    但您可以重新排列列,使其看起来更好。

    df.reindex_axis(sorted(df.columns), axis=1)
    

    希望对你有帮助

    编辑:

    如果您的字段不是 NaN 并且只是空字符串,您可以将它们替换为 NaN。为此,只需应用以下内容:

    df = df.apply(lambda x: x.str.strip(), axis=1).replace("", np.NaN)
    

    因此首先修剪每个字符串,然后用 NaN 替换。如果在那之后你想回到空字符串,就像

    df.fillna("")
    

    如果您的 nans 也是字符串,只需将其添加到替换方法中的字符串中,如下所示:replace(["","nan"], np.NaN)

    【讨论】:

    • 谢谢上面的详细解释;不幸的是,当我将您的代码应用于我的数据框时...... _Weight 列无法识别 NaN ;例如,Advisor_Weight 字段中的每一行都等于 50;我的数据框将空白显示为 nan --> 这会影响什么吗?
    猜你喜欢
    • 2023-04-10
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2019-09-02
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多