如何从图中的列名中删除下划线?
Posted
技术标签:
【中文标题】如何从图中的列名中删除下划线?【英文标题】:How to remove underscores from column names within plots? 【发布时间】:2022-01-15 15:15:54 【问题描述】:我正在使用在列名中有下划线作为空格的数据框。据我了解,这是一种很好的做法,所以我不想用空格重命名列。
在绘制各列之间的相关性时,列名在图中用下划线拼写出来。我希望能够使用空格来获得更清晰的阅读视觉效果。
有没有办法修改图中显示的名称,以便我可以用空格替换所有下划线和/或将这些图表中显示的标签重命名为与实际列名不同/更清晰的名称?目前我的绘图同时使用 matplotlib 和 seaborn。
编辑: 要添加更多关于我为什么这样做的来源的详细信息 - 我正在从 SQL 查询构建这个数据框。 SQL 数据库的列名中有下划线,因此它们在此处被继承。下面一个有用的答案是重命名生成的数据框以用空格替换下划线。我刚刚想到的另一个是在进行查询时将列导入为更易读的名称。如果我想通过添加细节,这还允许我将列更改为更加清晰。
SELECT table.column_name AS [Column Name]
但这留下了我的另一个问题 - 为什么在 SQL 数据库中的列名中没有空格很重要?理论上我可以做到,这样数据库就有我想要的空间。
【问题讨论】:
如果列名遵循 python 的语法,那么它们可以用作数据帧的属性。df.my_column
而不是 df["my column"]
。但仅此而已。我看不出它的“最佳实践”如何,它只是启用了这个功能。坚持索引并使用您想在绘图上看到的名称是完全合理的。
我还通过查询 SQL 数据库来构建这些数据框。也许是 SQL 不喜欢空格?不知何故,我意识到空格是坏的,下划线是好的。如果这不是真的,那么也许我可以回到空格以及我什至希望如何查看列名本身以降低复杂性。
好吧,在 sql 方面,你必须用空格 "my column"
或 [my column]
引用字符串,这可能很烦人。这可能就是“最佳实践”的来源。
【参考方案1】:
如果您将整个数据框传递给绘图方法
使用 pandas rename 方法和 Python 的字符串 replace
将下划线替换为空格。
一种方法是使用修改后的列名称创建一个辅助数据框,并将该新数据框传递给绘图方法,例如:
import pandas as pd
# Dummy df
df = pd.DataFrame(
'Column_1': pd.Series([1, 2, 3]),
'Column_2': pd.Series([1, 2, 3]),
'Column_3': pd.Series([1, 2, 3]),
)
modified_df = df.rename(columns=lambda name: name.replace('_', ' '))
print(df)
print(modified_df)
输出:
Column_1 Column_2 Column_3
0 1 1 1
1 2 2 2
2 3 3 3
Column 1 Column 2 Column 3
0 1 1 1
1 2 2 2
2 3 3 3
如果你不关心改变原始数据框,你可以进行这个操作inplace
,而不需要创建辅助数据框:
df.rename(columns=lambda name: name.replace('_', ' '), inplace=True)
如果你只需要一个带有修改标签的列表
您可以使用列表推导生成新标签:
labels = [col.replace('_', ' ') for col in df.columns]
【讨论】:
由于我正在处理从 SQL 数据库构建的数据框,因此仅修改列(结果也是相关矩阵的索引)是最简单的事情。modified_df = df.rename(columns=lambda name: name.replace('_',' '), index=lambda name: name.replace('_',' '))
【参考方案2】:
我发现 <your_col_name_here>.replace("_", " ").title()
对此非常有帮助。
这里有一些例子......
示例 1 - Matplotlib:
def show_iris_histograms():
cols_to_plot = [
"sepal_length",
"sepal_width",
"petal_length",
"petal_width",
]
fig = plt.figure(figsize=(10, 6))
for i, col_name in enumerate(cols_to_plot):
ax = fig.add_subplot(2, 2, i + 1)
iris[col_name].hist(bins=15, ax=ax)
col_name_label = col_name.replace("_", " ").title()
ax.set_title(col_name_label + " Distribution")
fig.tight_layout()
plt.show()
show_iris_histograms()
输出:
示例 2 - Seaborn:
def show_iris_pairplots():
pair_plot = sns.pairplot(iris, hue="class")
pair_plot.fig.get_children()[-1].set_title("Class")
for i in range(4):
for j in range(4):
x_label = pair_plot.axes[i][j].get_xlabel()
y_label = pair_plot.axes[i][j].get_ylabel()
pair_plot.axes[i][j].set_xlabel(
x_label.replace("_", " ").title(),
)
pair_plot.axes[i][j].set_ylabel(
y_label.replace("_", " ").title(),
)
plt.show()
show_iris_pairplots()
输出:
【讨论】:
感谢您的详细回复!这有助于理解在绘图上下文中执行此操作的方法(这就是我最初的问题听起来的样子)。但在数据框级别重命名数据框列和索引实际上更简单。问题出现是因为我正在从 SQL 查询构建数据框,并且 SQL 表有下划线。另一种选择可能是将 SQL 表列本身重命名为包含空格。我听说这样做是不好的做法,但我不是 100% 确定为什么。 SQL 中的空格似乎有变通方法。以上是关于如何从图中的列名中删除下划线?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spark 编写数据集时,如何将驼峰式列名修改为带下划线的小写?
如何从 Material-UI 中删除 TextField 的下划线? [复制]