将 Pandas DataFrame 列与替代拼写相结合

Combining Pandas DataFrame Columns with Alternate Spelling

我有一个从 json 文件导入的 DataFrame。 json 文件中的部分数据包括某些 string/categorical 属性的替代拼写,从而导致具有相似名称的列,其中值填充在一个、另一个或两者都不填充。我希望能够将具有替代拼写的列组合成一个列。理想情况下,我会转到源代码 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

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

请注意,当存在字符串值时,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

我将使用 .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