【问题标题】:Combining Pandas DataFrame Columns with Alternate Spelling将 Pandas DataFrame 列与替代拼写相结合
【发布时间】:2022-01-09 06:29:35
【问题描述】:

我有一个从 json 文件导入的 DataFrame。 json 文件中的部分数据包括某些字符串/分类属性的替代拼写,从而导致具有相似名称的列中的值填充在一个、另一个或两者中。我希望能够将具有替代拼写的列组合成一个列。理想情况下,我会去源代码,json文件,并修复它。在这种情况下我无法更改源,我只能使用它。

理想情况下,循环不会发生这种情况,因为对于真正的 DataFrame 有很多数据,这太慢了。

是条件

df_is = pd.DataFrame({"C1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        "C2": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
        "C3": ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"],
        "C4": ["S", np.NaN, "F", np.NaN, np.NaN, "S", "F", np.NaN, np.NaN, np.NaN],
        "c4": [np.NaN, "S", np.NaN, np.NaN, "S", np.NaN, np.NaN, np.NaN, np.NaN, "F"]})
display(df_is)

    C1  C2  C3  C4  c4
0   1   a   A   S   NaN
1   2   b   B   NaN S
2   3   c   C   F   NaN
3   4   d   D   NaN NaN
4   5   e   E   NaN S
5   6   f   F   S   NaN
6   7   g   G   F   NaN
7   8   h   H   NaN NaN
8   9   i   I   NaN NaN
9   10  j   J   NaN F

应该是条件

    C1  C2  C3  C4
0   1   a   A   S
1   2   b   B   S
2   3   c   C   F
3   4   d   D   NaN
4   5   e   E   S
5   6   f   F   S
6   7   g   G   F
7   8   h   H   NaN
8   9   i   I   NaN
9   10  j   J   F

【问题讨论】:

    标签: python pandas dataframe jupyter-notebook


    【解决方案1】:

    这里有一个解决方案。在一个真正的解决方案中,我可能会用正确的拼写覆盖列,然后删除另一个,但是对于这个版本,我创建了一个新列来并排显示旧列和组合列。

    请注意,当存在字符串值时,fill_value 设置对于处理原始列中的 NaN 很重要,因为尝试将像 np.NaN 这样的浮点数添加到字符串会导致 TypeError。

    代码

    df_solution["C4_Fixed"] = df_solution["C4"].add(df_solution["c4"], fill_value="")
    display(df_solution)
    

    输出

        C1  C2  C3  C4  c4  C4_Fixed
    0   1   a   A   S   NaN S
    1   2   b   B   NaN S   S
    2   3   c   C   F   NaN F
    3   4   d   D   NaN NaN NaN
    4   5   e   E   NaN S   S
    5   6   f   F   S   NaN S
    6   7   g   G   F   NaN F
    7   8   h   H   NaN NaN NaN
    8   9   i   I   NaN NaN NaN
    9   10  j   J   NaN F   F
    

    带有列替换的代码

    df_solution["C4"] = df_solution["C4"].add(df_solution["c4"], fill_value="")
    df_solution.drop(["c4"], axis=1, inplace= True)
    display(df_solution)
    

    替换列的输出

        C1  C2  C3  C4
    0   1   a   A   S
    1   2   b   B   S
    2   3   c   C   F
    3   4   d   D   NaN
    4   5   e   E   S
    5   6   f   F   S
    6   7   g   G   F
    7   8   h   H   NaN
    8   9   i   I   NaN
    9   10  j   J   F
    

    【讨论】:

      【解决方案2】:

      我会使用 .isna() 进行布尔访问:

      df_is.loc[df_is.C4.isna(), "C4"] = df_is.c4
      

      或(如果涉及的列名包含空格)

      df_is.loc[df_is["C4"].isna(), "C4"] = df_is["c4"]
      

      结果:

         C1 C2 C3   C4   c4
      0   1  a  A    S  NaN
      1   2  b  B    S    S
      2   3  c  C    F  NaN
      3   4  d  D  NaN  NaN
      4   5  e  E    S    S
      5   6  f  F    S  NaN
      6   7  g  G    F  NaN
      7   8  h  H  NaN  NaN
      8   9  i  I  NaN  NaN
      9  10  j  J    F    F
      

      【讨论】:

      • 我使用 %timeit 在我的真实 DataFrame(约 300k 行)上对我提出的解决方案和这个解决方案进行计时,而且速度更快(平均 44 毫秒对 66 毫秒)。但是,我认为重要的是要注意,如果您的冗余列名中的任何一个有空格(“Column_Name”和“Column Name”),则点表示法不起作用。等效的括号表示法起作用并且同样快: df_is.loc[df_is["C4"].isna(), "C4"] = df_is["c4"]
      • @MustardMan 感谢您的反馈!你是对的:我已经修改了答案以包含这一点。
      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 2019-11-10
      • 2017-05-27
      • 2021-07-07
      • 2023-03-11
      • 2016-04-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多