DataFrame ва хондани CSV
Барои чӣ ҷадвал лозим аст
Рӯйхати иштирокчиён ном, синну сол ва шаҳр дорад; сабти таҷҳизот рамз, тавоноӣ ва соатҳои корӣ дорад. Ҳамаи инро дар рӯйхатҳои ҷудо нигоҳ доштан душвор аст: бо ҷойивазкунии як рӯйхат робитаи майдонҳо вайрон мешавад. DataFrame додаҳоро дар сатрҳо ва сутунҳои номдор нигоҳ медорад ва интихоби майдонҳою ҳисоби нишондиҳандаҳои навро имкон медиҳад.
Ҳар сатр одатан як объект ё ҳодисаро тавсиф мекунад. Ҳар сутун як аломат ва навъи додаҳои худро дорад. Масалан, рамзи дастгоҳ сатр, вале соатҳои корӣ адад аст. Ин барои ҳисобот, санҷиши содироти додаҳо ва таҳлили таҷрибаҳо муфид аст. Аввал сохтори ҷадвалро фаҳмидан ва баъд натиҷаҳоро ҳисоб кардан муҳим аст.
1. DataFrame аз чӣ иборат аст
Ҳангоми сохтан аз луғат калидҳо номи сутунҳо ва рӯйхатҳо мазмуни онҳоро медиҳанд. Дарозии ҳамаи рӯйхатҳо бояд баробар бошад: барои ҳар объект дар ҳар сутун ячейка лозим аст. Ҳангоми чоп индекси сатрҳо дар чап меояд. Он ба шумораи сутунҳои shape дохил намешавад.
import pandas as pd
df = pd.DataFrame({
"device": ["A", "B", "C"],
"watts": [60, 40, 20],
"hours": [2, 3, 5],
})
print(df)
print(df.shape)
print(df.columns.tolist())
Натиҷа:
device watts hours
0 A 60 2
1 B 40 3
2 C 20 5
(3, 3)
['device', 'watts', 'hours']
2. Хондани CSV бе файли беруна
CSV формати матнӣ аст: сатри аввал одатан номи сутунҳо ва сатрҳои баъдӣ қиматҳои бо ҷудокунанда ҷудошударо доранд. pd.read_csv роҳи файл ё объекти хонандаи матнро қабул мекунад. Барои мисоли такроршаванда io.StringIO мегирем: он сатрро ҳамчун файли матнии кушода пешниҳод мекунад. Ин роҳ ҳангоми мавҷуд будани чанд ҷадвал дар вуруд ҳам муфид аст.
read_csv навъҳоро аз мазмун муайян мекунад. Агар рамз ба адад монанд бошад, аммо сифрҳои аввала муҳим бошанд, dtype-ро ошкоро диҳед. Барои ҷудокунандаи ; параметри sep=";" лозим аст. Агар сарлавҳа набошад, header=None истифода мешавад, вагарна сабти аввал иштибоҳан номи сутунҳо мешавад.
import io
data = io.StringIO("code;hours\n007;2\n012;5\n")
table = pd.read_csv(data, sep=";", dtype={"code": str})
print(table["code"].tolist())
print(table["hours"].tolist())
Натиҷа:
['007', '012']
[2, 5]
Дар масъалаҳо pd.read_csv(sys.stdin) CSV-ро аз вуруди стандартӣ мехонад. Агар пеш аз CSV параметрҳо бошанд, аввал онҳоро бо input() хонед ва баъд қисми боқимондаи ҷараёнро ба pandas диҳед. Ҳар сатри CSV-ро дастӣ аз рӯйи вергул ҷудо накунед: дар CSV-и дуруст дохили қиматҳои нохунакдор ҳам ҷудокунанда буда метавонад.
3. Муоинаи аввал
shape ҷуфти «сатрҳо, сутунҳо», len(df) шумораи сатрҳо ва columns номҳои сутунҳост. head(n) ва tail(n) аввалу охирро нишон медиҳанд. dtypes ададҳои тасодуфан ҳамчун сатр хондашударо ошкор мекунад. describe() омори сутунҳои ададиро медиҳад: барои санҷиши ҳадҳо қулай аст, аммо дурустии ҳамаи сабтҳоро исбот намекунад.
print(len(df))
print(df.dtypes)
print(df.head(1))
print(df.tail(1))
print(df.describe().loc[["min", "max"], "hours"].to_dict())
Натиҷа:
3
device object
watts int64
hours int64
dtype: object
device watts hours
0 A 60 2
device watts hours
2 C 20 5
{'min': 2.0, 'max': 5.0}
4. Як сутун ё ҷадвали хурд
df["watts"] Series медиҳад: натиҷа як меҳвар бо индекси сатрҳо дорад. df[["device", "hours"]] рӯйхати номҳоро гирифта, DataFrame медиҳад: сатрҳо ва сутунҳо нигоҳ дошта мешаванд. Бо қавсҳои дукарата ҳатто як сутунро ҳамчун ҷадвал гирифтан мумкин аст. Интихоб ҷадвали аслиро ҷойиваз намекунад; тартиби сутунҳои интихобиро рӯйхат муайян мекунад.
print(type(df["watts"]).__name__)
print(df[["hours"]].shape)
print(df[["device", "hours"]])
print(df["watts"].sum())
Натиҷа:
Series
(3, 1)
device hours
0 A 2
1 B 3
2 C 5
120
5. Аломатҳои нав ва сатрҳо
Ҳисоб байни ду сутуни ададӣ унсур ба унсур бо риояи индекс иҷро мешавад. Бахшидан ба номи сутуни нав натиҷаро дар ҷадвал нигоҳ медорад. Барои дастгоҳҳо энергияро бо ватт-соат ҳисоб мекунем: тавоноӣ ба вақти кор зарб мешавад. Ин ҳисоби ҳар сабт аст, на ҳосили зарби ҷамъҳои сутунҳо.
iloc сатрро аз рӯйи мавқеъ ва loc аз рӯйи тамғаи индекс ва номи сутун интихоб мекунад. Як сатр Series мешавад, ки тамғаҳояш номи сутунҳо мебошанд. Барои чоп майдонҳоро ошкоро гирифтан қулай аст.
df["wh"] = df["watts"] * df["hours"]
print(df["wh"].tolist())
print(df.iloc[2]["device"])
print(df.loc[1, "wh"])
for device, hours in zip(df["device"], df["hours"]):
print(device, hours)
Натиҷа:
[120, 120, 100]
C
120
A 2
B 3
C 5
Дар дохил чӣ рӯй медиҳад
DataFrame ду меҳвар дорад: индекси сатрҳо ва номи сутунҳо. Сутунҳо ба массивҳо такя мекунанд ва метавонанд навъҳои гуногун дошта бошанд. Аз ин рӯ амал барои тамоми сутуни ададӣ одатан аз давраи Python аз рӯйи сатрҳо самараноктар аст. Series-и интихобшуда индекси ҷадвали аслиро нигоҳ медорад; ҳангоми бахшидани Series-и дигар pandas тамғаҳоро мувофиқ мекунад, на ин ки танҳо қиматҳоро пайдарпай нусха кунад.
iterrows() ҳам аз рӯйи сатрҳо мегардад, аммо барои ҳар сатр Series месозад ва метавонад тарзи ифодаи навъҳоро дар он тағйир диҳад. Барои чопи одӣ zip аз рӯйи сутунҳои лозим кофӣ аст. Барои ҳисоб аввал ифодаи сутуниро ҷӯед.
Хатоҳои маъмул ва ислоҳи онҳо
- Рӯйхатҳои дарозиашон гуногун.
pd.DataFrame({"a": [1, 2], "b": [3]})хатоиValueErrorмедиҳад. Дар ҳар сутун барои ҳар сатр як қимат диҳед. - Фаромӯш кардани рӯйхати дохилӣ.
df["device", "hours"]як калиди таркибиро меҷӯяд ва одатанKeyErrorмедиҳад. Дуруст:df[["device", "hours"]]. - Сутун ҳисобидани индекс. Ҷадвали чопшуда гӯё чор сутун дорад, аммо дар оғоз
df.shape[1]се аст. Индексро алоҳида ҳисоб кунед. - Нигоҳ надоштани натиҷаи ҳазф.
df.drop(columns=["wh"])ҷадвал медиҳад, валеdfпешина мемонад. Натиҷаро нигоҳ доред:df = df.drop(columns=["wh"]).
Ёддошт
| Ҳадаф | Восита |
|---|---|
| Сохтан / хондан | pd.DataFrame(...), pd.read_csv(...) |
| Санҷиши сохтор | shape, columns, dtypes, head() |
| Гирифтани Series / ҷадвал | df["a"], df[["a"]] |
| Иловаи сутун | df["new"] = expression |
| Интихоби ячейка | df.loc[label, "a"], df.iloc[i, j] |
| Чопи чанд майдон | zip(df["a"], df["b"]) |