Гузариш ба мундариҷа
Мавзӯи 4 аз 7

Мураттабсозӣ ва сутунҳои ҳисобшаванда

Барои чӣ мураттаб мекунем ва сутун месозем

Баъди интихоби сабтҳо аксар вақт тартиби фаҳмо лозим аст: таҷҳизоти зудтарин, амалиёти дарозтарин ё чанд натиҷаи аввал. Тартиб бояд ҳамаи қоидаҳоро, махсусан баробарии нишондиҳандаи асосиро риоя кунад. Вагарна ҳисобот дуруст менамояд, аммо маҳз барои қиматҳои баробар ҷавоби нодуруст медиҳад.

Ба ғайр аз майдонҳои аслӣ сутунҳои ҳисобшаванда муфиданд: натиҷа нисбат ба вақт, рамзи ададии гурӯҳ ё ҷой байни мушоҳидаҳо. Мураттабсозӣ, ивазкунӣ бо map, татбиқи функсия бо apply ва қоидаҳои rank-ро меомӯзем. Додаҳои нав ба тартибдиҳӣ ёрӣ медиҳанд, аммо иловаи сутун худ аз худ тартиби сатрҳоро тағйир намедиҳад.

1. Мураттабсозӣ аз рӯйи як аломат

sort_values қиматҳои сутуни номбаршударо муқоиса мекунад. Бо нобаёнӣ қиматҳои хурдтар аввал меоянд; ascending=False самтро баръакс мекунад. Метод ҷадвали нав медиҳад ва ҷадвали аслӣ мемонад. Индексҳо ҳамроҳи сатрҳо мекӯчанд, зеро тамға ба сабт тааллуқ дорад, на ба ҷойи нави он дар экран.

import pandas as pd

df = pd.DataFrame({
    "device": ["C", "A", "B", "D"],
    "output": [30, 50, 30, 10],
    "hours": [3, 5, 2, 2],
})
ordered = df.sort_values("output", ascending=False, kind="stable")
print(ordered["device"].tolist())
print(ordered.index.tolist())
print(df["device"].tolist())

Натиҷа:

['A', 'C', 'B', 'D']
[1, 0, 2, 3]
['C', 'A', 'B', 'D']

2. Чанд аломат ва сатрҳои аввал

Рӯйхати by афзалиятро муайян мекунад: аввал сутуни якум, ҳангоми баробарӣ дуюм ва баъд сеюм муқоиса мешавад. Рӯйхати ascending бояд ҳамон дарозиро дошта бошад. Агар дар мураттабсозии яксутуна тартиби аслии қиматҳои баробар муҳим бошад, kind="stable" диҳед.

head(k) аввалин k сатри тартиби тайёрро мегирад. Барои интихоби одии ададӣ nlargest ва nsmallest ҳастанд, аммо қоидаҳои иловагии баробариро дар sort_values ошкоро навиштан қулайтар аст. reset_index(drop=True) тамғаҳои пешинаро бо рақамгузории нав иваз карда, индекси пешинаро ба сутуни ҷудо намегузорад.

ordered = df.sort_values(["output", "hours"], ascending=[False, True])
print(ordered.head(3)["device"].tolist())
print(ordered.reset_index(drop=True).index.tolist())
print(df.nsmallest(2, "hours")["device"].tolist())

Натиҷа:

['A', 'B', 'C']
[0, 1, 2, 3]
['B', 'D']

3. map: қимат аз рӯйи луғат

Луғати мувофиқат гурӯҳро ба рамзи лозим табдил медиҳад. Series.map ҳар қимати аслиро байни калидҳои луғат меҷӯяд ва қимати ёфтшударо мегузорад. Агар калид набошад, NaN пайдо мешавад. Ин нишонаи муфиди гурӯҳи номаълум аст, на иҷозати худкори сифр шуморидани он. fillna танҳо ҳангоми ба маънои масъала мувофиқ будани қимати пешфарз муносиб аст.

sizes = pd.Series(["S", "L", "M", "XL"])
codes = sizes.map({"S": 1, "M": 2, "L": 3})
print(codes.tolist())
print(codes.fillna(0).astype(int).tolist())

Натиҷа:

[1.0, 3.0, 2.0, nan]
[1, 3, 2, 0]

4. apply: қоидаи худӣ

Агар табдили тайёр набошад, функсия метавонад қоидаро барои як қимат тавсиф кунад. Series.apply онро барои унсурҳои сутун даъват мекунад. Функсия бояд натиҷаро бо return баргардонад; танҳо print дар дохили он сутуни лозим намесозад. Номи функсия ва аргументро худ интихоб мекунед, аммо қоида бояд барои ҳамаи додаҳои иҷозашуда кор кунад.

Дар DataFrame параметри axis=1 як сатри пурраро ба функсия медиҳад. Бе он apply бо нобаёнӣ бо сутунҳо кор мекунад. Барои арифметикаи одӣ ифодаи сутунӣ беҳтар аст: кӯтоҳтар ва одатан тезтар мебошад.

def excess(value):
    return max(value - 20, 0)

print(df["output"].apply(excess).tolist())
print(df.apply(lambda row: row["output"] / row["hours"], axis=1).tolist())
df["rate"] = df["output"] / df["hours"]
print(df["rate"].tolist())

Натиҷа:

[10, 30, 10, 0]
[10.0, 10.0, 15.0, 5.0]
[10.0, 10.0, 15.0, 5.0]

5. Гирдкунӣ ва формати чоп

round(2) қиматҳоро гирд мекунад, аммо ду рақами намоёнро кафолат намедиҳад: 10.0 метавонад бо як рақам чоп шавад. Формати :.2f сатре бо маҳз ду рақам пас аз нуқта месозад. Барои ҳисобҳои пулӣ донистани марҳилаи гирдкунӣ муҳим аст: пеш аз мураттабсозӣ ё танҳо ҳангоми чоп. Дар ин ҷо танҳо ду тарзи пешниҳоди як натиҷаро муқоиса мекунем.

values = pd.Series([10.0, 2 / 3])
print(values.round(2).tolist())
print([f"{x:.2f}" for x in values])

Натиҷа:

[10.0, 0.67]
['10.00', '0.67']

6. rank ва қиматҳои баробар

Ранг ҷойи ададии қимат байни дигар қиматҳост. Бо нобаёнӣ қиматҳои хурдтар ранги хурдтар мегиранд; ascending=False калонҳоро пеш мегузорад. Қоидаи min ба баробарҳо ҷойи хурдтарини муштарак медиҳад ва фосила мемонад. dense фосиларо барҳам медиҳад, first баробариро аз рӯйи пайдоиш ҳал мекунад ва қоидаи пешфарзи average ҷойҳои ишғолшударо миёна мекунад. Рангҳо ҳамчун ададҳои касрӣ бармегарданд, ҳатто агар қоида ҷойҳои бутун диҳад.

scores = pd.Series([50, 30, 30, 10])
for method in ["average", "min", "dense", "first"]:
    print(method, scores.rank(ascending=False, method=method).tolist())

Натиҷа:

average [1.0, 2.5, 2.5, 4.0]
min [1.0, 2.0, 2.0, 4.0]
dense [1.0, 2.0, 2.0, 3.0]
first [1.0, 2.0, 3.0, 4.0]

Дар дохил чӣ рӯй медиҳад

Мураттабсозӣ аз рӯйи калидҳо тартиби ҷойивазкунии сатрҳоро месозад ва якбора ба ҳамаи сутунҳо татбиқ мекунад: майдонҳои як объект ҷудо намешаванд. map барои ҳар қимат мувофиқат меҷӯяд. apply функсияи корбарро борҳо даъват мекунад; дар ҷадвалҳои калон харҷи иловагии Python намоён мешавад. Ифодаи векторӣ корро ба амалҳои массивӣ дода, одатан ин даъватҳоро кам мекунад.

Хатоҳои маъмул ва ислоҳи онҳо

  1. Як самт барои ҳамаи калидҳо. ascending=False дар ду сутун ҳар дуро баръакс мекунад. Агар як нишондиҳанда бо тартиби афзоиш лозим бошад, рӯйхат диҳед, масалан [False, True].
  2. Интизори тағйири ҷадвали аслӣ шудан. df.sort_values("output") тартибро дар df нигоҳ намедорад. Натиҷаро ба тағйирёбандаи нав ё худи df бахшед.
  3. Калидҳои номаълуми map. XL дар луғат нест, пас NaN мешавад. Калидро илова кунед ё бо fillna қимати пешфарзро бошуурона диҳед.
  4. Омехтани ранг ва мураттабсозӣ. df["rate"].rank() ҷойҳоро бо тартиби аслии сатрҳо медиҳад. Барои ҳисоботи мураттаб ҷадвалро алоҳида мураттаб кунед.

Ёддошт

  • Тартиб бо афзалиятҳо: sort_values([a, b], ascending=[False, True]).
  • Сабтҳои аввал: head(k), nlargest, nsmallest.
  • Рақамгузории нав: reset_index(drop=True).
  • Мувофиқатҳо: s.map(mapping); функсияи худӣ: s.apply(func).
  • Барои арифметика амалҳои сутуниро авло донед.
  • Ҷойҳо: rank(method="min" / "dense" / "first"); чоп: f"{x:.2f}".