将 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
我有一个从 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