【问题标题】:pd.Series string replacement modifying values unexpectedlypd.Series 字符串替换意外修改值
【发布时间】:2020-03-21 22:14:35
【问题描述】:

我认为我对字符串替换的理解缺少一些东西。提前感谢您的帮助。

我有一个类似于下面的数据框:

combine_cols = pd.DataFrame({'totalannualmembers' : [85494.0, np.NaN, np.NaN], 
              'totalannualmembershipssold' : [np.NaN, 90000.0, np.NaN]})

我想将两列合并或合并为一列。为此,我将 NaN 替换为空字符串并将列转换为 str 类型。下面的代码结合了 2 列。

join_cols = ['totalannualmembers', 'totalannualmembershipssold']

#fill NaN with empty string
combine_cols.fillna('', axis = 1, inplace = True)

#convert columns to str type
combine_cols = combine_cols[join_cols].astype(str)

#combine into a single column
combine_cols['combine_test'] = combine_cols['totalannualmembers'].str.cat(combine_cols['totalannualmembershipssold'],sep="")

由于空字符串,当我尝试将 combine_cols.combine_test 列转换回整数/浮点类型时,出现了我的问题。我尝试用以下内容替换空字符串:

combine_cols.combine_test = combine_cols.combine_test.str.replace('', '9999')

虽然这会更改空字符串,但它似乎也在更改我想要保留的值。例如,当期望的输出保持为 85494.0 时,combine_test 索引 550 也会发生变化。

combine_cols.iloc[550]
---------------------------------------------------------------------------
totalannualmembers                                            85494.0
totalannualmembershipssold                                           
combine_test                  99998999959999499999999949999.999909999
Name: 550, dtype: object

有没有更好的方法将这两列合并为一列或转换空字符串以便我可以将列转换回浮点类型进行分析?

combine_cols.combine_test 的期望输出是:

0       85494.0
1       90000.0
2       NaN

【问题讨论】:

  • 如果存在两个值会怎样?这意味着两列都没有np.nan
  • 那个实例没有出现在我的数据中。生成的数据框是来自多个 csv 文件的合并数据框,两列从未同时使用
  • 您可能想查看其他答案。此外,如果您希望将来自不同数据帧的多个列合并在一起,您可能需要考虑使用combine(假设您使用了pd.read_csv
  • 我只是在检查您和 David 的解决方案,非常感谢更高的效率和简单的替代方案。我很感激这些信息让我改进——谢谢大家

标签: python pandas


【解决方案1】:

您可以使用fillna

combine_cols['combine_test'] = (combine_cols['totalannualmembers']
                                   .fillna(combine_cols.totalannualmembershipssold)
                               )

输出:

   totalannualmembers  totalannualmembershipssold  combine_test
0             85494.0                         NaN       85494.0
1                 NaN                     90000.0       90000.0
2                 NaN                         NaN           NaN

【讨论】:

    【解决方案2】:

    我认为您必须遵循的方法是:

    combine_cols.combine_test[combine_cols.combine_test == ""] = "9999"
    

    combine_cols.combine_test[combine_cols.combine_test == ""] 要求我们的数据框仅搜索 combine_test 列中与空字符串匹配的行,并将其替换为字符串 "9999"。

    如果这有帮助,请告诉我:D!

    【讨论】:

    • 伟大的简单解决方案不敢相信我没有考虑索引分配;谢谢
    • 不客气 :D,祝你的项目好运!编码愉快!
    【解决方案3】:

    对于您希望对我做的事情来说,您的解决方案似乎太复杂了。 你可能只是想做...

    另外,由于您不处理字符串......它必须更快。

    combine_cols = pd.DataFrame({
        'totalannualmembers' : [85494.0, np.NaN, np.NaN], 
        'totalannualmembershipssold' : [np.NaN, 90000.0, np.NaN]
    })
    
    combine_cols['test'] = combine_cols.loc[:, 'totalannualmembers']
    
    mask = combine_cols['totalannualmembers'].isna()
    combine_cols.loc[mask, 'test'] = combine_cols.loc[mask, 'totalannualmembershipssold']
    print(combine_cols)
    # 0             85494.0                         NaN  85494.0
    # 1                 NaN                     90000.0  90000.0
    # 2                 NaN                         NaN      NaN
    

    【讨论】:

      【解决方案4】:

      如果您在创建数据框后正在寻找一种更“有趣”的方式:)。

      combine_cols.melt(value_name='combine_test').drop('variable', axis=1).drop_duplicates().reset_index(drop=True)
      

      1) 将列合并为一个组合列,列标题被移动到行中,并将列命名为“combine_test”

      2) 删除不必要的“变量”列,该列是在列标题从熔化中变成行的位置创建的。

      3) 删除重复行并将索引重置为 0、1、2 并传递 drop=True 以避免重置后添加新列。

      【讨论】:

        【解决方案5】:

        尝试使用 pandas.concat() 并查看它是否适合您。我还使用 pandas.DataFrame.dropna() 删除了所有缺失值,并使用 pandas.DataFrame.reset_index 重置了索引。

        combine_cols = pd.concat([combine_cols['totalannualmembers'],combine_cols['totalannualmembershipssold']], ignore_index=True)
        combine_cols.dropna(inplace=True)
        combine_cols.reset_index(drop=True, inplace=True)
        print(combine_cols)
        

        这个输出应该是:

        0    85494.0
        1    90000.0
        dtype: float64
        

        查看这些网站了解更多信息:

        [1]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html

        [2]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html

        [3]https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-22
          • 2022-11-20
          • 2021-12-13
          • 2012-06-03
          • 2012-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多