පැන්ඩාස් හි දත්ත රාමුවක පේළි හරහා නැවත ක්රියා කරන්නේ කෙසේද?
පිළිතුර: එපා * !
පැන්ඩාස් හි අනුකරණය කිරීම ප්රති-රටාවක් වන අතර ඔබ කළ යුත්තේ ඔබ අනෙක් සෑම විකල්පයක්ම අවසන් කළ විට පමණි. iter
පේළි දහස් ගණනකට වඩා එහි නමෙහි " " සමඟ කිසිදු කාර්යයක් භාවිතා නොකළ යුතුය, නැතහොත් ඔබට බොහෝ කාලයක් බලා සිටීමට පුරුදු වනු ඇත .
ඔබට දත්ත රාමුවක් මුද්රණය කිරීමට අවශ්යද? භාවිතා කරන්න DataFrame.to_string()
.
ඔබට යමක් ගණනය කිරීමට අවශ්යද? එවැනි අවස්ථාවක, මෙම අනුපිළිවෙලෙහි ක්රම සොයන්න (ලැයිස්තුව මෙතැන් සිට වෙනස් කරන ලදි ):
- දෛශිකකරණය
- සයිතන් චර්යාවන්
- ලැයිස්තු අවබෝධය (වැනිලා
for
ලූප්)
DataFrame.apply()
: i) සයිතන් හි සිදු කළ හැකි අඩු කිරීම්, ii) පයිතන් අවකාශයේ අනුකරණය කිරීම
DataFrame.itertuples()
සහ iteritems()
DataFrame.iterrows()
iterrows
සහ itertuples
(මෙම ප්රශ්නයට පිළිතුරු වශයෙන් බොහෝ ඡන්ද ලබා ගැනීම) අනුක්රමික සැකසුම් සඳහා පේළි වස්තු / නාම පුවරු උත්පාදනය කිරීම වැනි ඉතා දුර්ලභ අවස්ථාවන්හිදී භාවිතා කළ යුතුය, ඇත්ත වශයෙන්ම මෙම කාර්යයන් සඳහා ප්රයෝජනවත් වන එකම දෙය මෙයයි.
අධිකාරියට අභියාචනයක් ඉදිරිපත් කරන්න
පුනරාවර්තනයේ ප්රලේඛන පිටුවේ විශාල රතු අනතුරු ඇඟවීමේ පෙට්ටියක් ඇත:
පැන්ඩා වස්තූන් හරහා ගමන් කිරීම සාමාන්යයෙන් මන්දගාමී වේ. බොහෝ අවස්ථාවන්හීදී, පේළි හරහා අතින් නැවත යෙදීම අවශ්ය නොවේ [...].
* එය ඇත්ත වශයෙන්ම "එපා" යන්නට වඩා ටිකක් සංකීර්ණයි. df.iterrows()
මෙම ප්රශ්නයට නිවැරදි පිළිතුර වේ, නමුත් "ඔබේ දෘෂ්ටි කෝණය දෛශික කරන්න" වඩා හොඳ එකකි. පුනරාවර්තනය වළක්වා ගත නොහැකි තත්වයන් ඇති බව මම පිළිගනිමි (නිදසුනක් ලෙස, සමහර මෙහෙයුම්වල ප්රති result ලය පෙර පේළිය සඳහා ගණනය කළ අගය මත රඳා පවතී). කෙසේ වෙතත්, කවදාදැයි දැන ගැනීමට පුස්තකාලය සමඟ යම් දැනුමක් අවශ්ය වේ. ඔබට ක්රියාකාරී විසඳුමක් අවශ්ය දැයි ඔබට විශ්වාස නැත්නම්, ඔබට බොහෝ විට අවශ්ය නොවේ. PS: මෙම පිළිතුර ලිවීම සඳහා මගේ තාර්කිකත්වය ගැන වැඩි විස්තර දැනගැනීම සඳහා, පහළට යන්න.
මූලික මෙහෙයුම් සහ ගණනය කිරීම් වලින් හොඳ සංඛ්යාවක් පැන්ඩස් විසින් "දෛශිකකරණය" කරනු ලැබේ (NumPy හරහා හෝ සයිතොනීකරණය කරන ලද කාර්යයන් හරහා). මෙයට අංක ගණිතය, සැසඳීම්, (බොහෝ) අඩු කිරීම්, නැවත සකස් කිරීම (හැරීම වැනි), සම්බන්ධ වීම සහ කණ්ඩායම් ක්රියාකාරකම් ඇතුළත් වේ. ඔබේ ගැටළුව සඳහා සුදුසු දෛශික ක්රමයක් සොයා ගැනීම සඳහා අත්යවශ්ය මූලික ක්රියාකාරිත්වය පිළිබඳ ප්රලේඛනය බලන්න .
කිසිවක් නොමැති නම්, අභිරුචි සයිතන් දිගු භාවිතා කර ඔබේම දෑ ලිවීමට නිදහස් වන්න .
1) දෛශික විසඳුමක් නොමැති නම්, 2) කාර්ය සාධනය වැදගත්, නමුත් ඔබේ කේතය සයිතොනීකරණය කිරීමේ කරදරයෙන් මිදීමට තරම් වැදගත් නොවේ නම්, ලැයිස්තු අවබෝධය ඔබේ ඊළඟ ඇමතුම් වරාය විය යුතුය. ඔබේ කේතය මත. ඒ නිසා එය සාක්ෂි හොඳ මුදලක් බව ලැයිස්තුව comprehensions පොදු Pandas කාර්යයන් බොහෝ ප්රමාණවත් තරම් වේගවත් (සහ ඇතැම් විට වේගවත්) යෝජනා කිරීමට.
සූත්රය සරලයි,
# Iterating over one column - `f` is some function that processes your data
result = [f(x) for x in df['col']]
# Iterating over two columns, use `zip`
result = [f(x, y) for x, y in zip(df['col1'], df['col2'])]
# Iterating over multiple columns - same data type
result = [f(row[0], ..., row[n]) for row in df[['col1', ...,'coln']].to_numpy()]
# Iterating over multiple columns - differing data type
result = [f(row[0], ..., row[n]) for row in zip(df['col1'], ..., df['coln'])]
ඔබේ ව්යාපාර තර්කනය ශ්රිතයකට සම්බන්ධ කර ගත හැකි නම්, ඔබට එය ලැයිස්තුගත අවබෝධයක් භාවිතා කළ හැකිය. අමු පයිතන් කේතයේ සරල බව සහ වේගය හරහා ඔබට අත්තනෝමතික ලෙස සංකීර්ණ දේවල් ක්රියාත්මක කළ හැකිය.
ගුහා
ලැයිස්තු අවබෝධය ඔබගේ දත්ත සමඟ වැඩ කිරීම පහසු යැයි උපකල්පනය කරයි - එයින් අදහස් කරන්නේ ඔබේ දත්ත වර්ග ස්ථාවර වන අතර ඔබට NaNs නොමැති නමුත් මෙය සැමවිටම සහතික කළ නොහැක.
- පළමුවැන්න වඩාත් පැහැදිලිය, නමුත් NaNs සමඟ ගනුදෙනු කිරීමේදී, ඒවා තිබේ නම් සාදන ලද පැන්ඩා ක්රම වලට වැඩි කැමැත්තක් දක්වන්න (ඒවාට වඩා හොඳ කොන-නඩත්තු කිරීමේ තර්කනයක් ඇති නිසා), හෝ ඔබේ ව්යාපාර තර්කනයට සුදුසු NaN හැසිරවීමේ තර්කනය ඇතුළත් බව සහතික කරන්න.
- මිශ්ර දත්ත වර්ග සමඟ ගනුදෙනු කිරීමේදී ඔබ වඩාත් සුලභ වර්ගයට දත්ත ව්යංගයෙන් උඩුගත
zip(df['A'], df['B'], ...)
කරනවා වෙනුවට නැවත නැවත යෙදිය යුතුය df[['A', 'B']].to_numpy()
. උදාහරණයක් ලෙස A සංඛ්යාත්මක නම් සහ B නූල් to_numpy()
නම්, මුළු අරාවම නූල් වලට දමනු ඇත, එය ඔබට අවශ්ය දේ නොවිය හැකිය. වාසනාවකට මෙන් zip
ඔබේ තීරු එකට ඇලවීම මේ සඳහා වඩාත්ම සරල විසඳුමයි.
* ඉහත සඳහන් කේවට්ස් කොටසේ දක්වා ඇති හේතු නිසා ඔබේ සැතපුම් ගණන වෙනස් විය හැකිය .
පැහැදිලි උදාහරණයක්
පැන්ඩා තීරු දෙකක් එකතු කිරීමේ සරල උදාහරණයකින් වෙනස නිරූපණය කරමු A + B
. මෙය දෛශිකකරණය කළ හැකි ඔපෙරෝනයකි, එබැවින් ඉහත සාකච්ඡා කළ ක්රමවේදයන්ගේ ක්රියාකාරිත්වය වෙනස් කිරීම පහසු වනු ඇත.
ඔබේ යොමු කිරීම සඳහා මිණුම් සලකුණු කේතය . පතුලේ ඇති රේඛාව මම්පන්ඩාස් හි ලියා ඇති ශ්රිතයක් මනිනු ලබයි. ඔබ කරන්නේ කුමක්දැයි ඔබ නොදන්නේ නම් අංකපන්ඩා කේතය ලිවීමෙන් වැළකී සිටිය යුතුය. දණ්ඩක් ඔබ (එනම්, වැඩි කැමැත්තක් කළ හැකි API වෙත vec
භාර vec_numpy
).
කෙසේ වෙතත්, සෑම විටම මෙම කප්පාදුව හා වියලි නොවන බව මා සඳහන් කළ යුතුය. සමහර විට "මෙහෙයුමක් සඳහා හොඳම ක්රමය කුමක්ද" යන්නට පිළිතුර "එය ඔබගේ දත්ත මත රඳා පවතී" යන්නයි. මගේ අවවාදය නම් එකක් මත පදිංචි වීමට පෙර ඔබේ දත්ත පිළිබඳ විවිධ ප්රවේශයන් පරීක්ෂා කිරීමයි.
තවදුරටත් කියවීම
* පැන්ඩා සංගීත ක්රම “දෛශිකකරණය” කර ඇත්තේ ඒවා ශ්රේණියේ නිශ්චිතව දක්වා ඇති නමුත් එක් එක් මූලද්රව්ය මත ක්රියාත්මක වන බැවිනි. නූල් මෙහෙයුම් දෛශිකකරණයට සහජයෙන්ම අසීරු බැවින් යටින් පවතින යාන්ත්රණයන් තවමත් ක්රියාකාරී වේ.
ඇයි මම මේ පිළිතුර ලිව්වේ
නව පරිශීලකයින්ගෙන් මා දකින පොදු ප්රවණතාවක් නම් "X කිරීමට මගේ ඩීඑෆ් හරහා නැවත ක්රියා කරන්නේ කෙසේද?". ලූපයක් iterrows()
තුළ යමක් කරන අතරතුර ඇමතුම් ලබා දෙන කේතය පෙන්වයි for
. මෙන්න හේතුව. දෛශිකකරණය පිළිබඳ සංකල්පයට හඳුන්වා දී නොමැති පුස්තකාලයට නව පරිශීලකයෙකු යමක් කිරීමට ඔවුන්ගේ දත්ත නැවත කියවීමේදී ඔවුන්ගේ ගැටළුව විසඳන කේතය දැකගත හැකිය. ඩේටා ෆ්රේම් හරහා නැවත ක්රියා කරන්නේ කෙසේදැයි නොදැන, ඔවුන් කරන පළමු දෙය ගූගල් එය වන අතර මෙම ප්රශ්නයේදී මෙහි අවසන් වේ. ඔවුන් පිළිගත් පිළිතුර ඔවුන්ට කෙසේ කළ යුතු දැයි පවසන අතර, ඔවුන් ඇස් වසාගෙන මෙම කේතය ධාවනය කරන්නේ නිවැරදිව නොවේ නම් නැවත ප්රශ්න කිරීමකින් තොරව ය.
මෙම පිළිතුරේ පරමාර්ථය වන්නේ නව පරිශීලකයින්ට සෑම ගැටළුවකටම විසඳුම අත්යවශ්ය නොවන බවත්, වඩා හොඳ, වේගවත් හා වඩා මුග්ධ විසඳුම් පැවතිය හැකි බවත් ඒවා ගවේෂණය කිරීම සඳහා කාලය ආයෝජනය කිරීම වටී බවත් තේරුම් ගැනීමට උපකාර කිරීමයි. මම දෛශිකකරණයට එදිරිව පුනරාවර්තන යුද්ධයක් ආරම්භ කිරීමට උත්සාහ නොකරමි, නමුත් මෙම පුස්තකාලය සමඟ ඔවුන්ගේ ගැටළු වලට විසඳුම් ලබා දීමේදී නව පරිශීලකයින් දැනුවත් කිරීමට මට අවශ්යය.