Ваш порядок в ss
и имена столбцов в idx2
спарены, поэтому вы можете использовать один цикл и в конечном итоге получить желаемые результаты для гистограммы пола и задания (но в этом случае вы не получите в итогес гистограммами для возраста или сохранения). Последние несколько строк вашего примера будут выглядеть так:
for k, j in zip(range(0, len(ss)), idx2):
pandasdf = pd.DataFrame(data)
sns.countplot(x=j, data=pandasdf, order=ss[k])
plt.title("Histogram of " + data_feature_names[j])
plt.xlabel(data_feature_names[j])
plt.show()
Есть несколько способов упростить это, чтобы немного легче было отлаживать. Например, вы можете сократить цикл для idx2
, используя понимание списка:
idx2 = [ix for ix, f in enumerate(types) if f == "cat"]
Ниже я привел дополнительный пример с несколькими строками кода, но с большей модификацией по сравнению с оригинальным сценарием. .
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
data = pd.DataFrame(
[
[11, "male", 1222, "teacher"],
[23, "female", 333, "student"],
[15, "male", 542, "security"],
[23, "male", 4422, "farmer"],
[25, "female", 553, "farmer"],
[22, "male", 221, "teacher"],
[27, "male", 333, "agent"],
[11, "female", 33, "farmer"],
],
columns=["age", "gender", "saving", "job"],
)
ordering = {
"gender": ["female", "male"],
"job": ["farmer", "agent", "security", "teacher", "student"],
}
for column in ['gender', 'job']:
ax = sns.countplot(x=column, data=data, order=ordering.get(column, None))
ax.set_title("Histogram of {}".format(column))
ax.set_xlabel(column)
plt.show()