#python #pandas #dataframe
Вопрос:
У меня есть фрейм данных со столбцом category
. Мне нужно отсортировать столбец с учетом регистра. Пожалуйста, найдите ниже пример кода.
import pandas as pd
import json
pd.set_option("display.max_rows", None, "display.max_columns", None)
json_str = '{"index":{"0":0,"1":1,"2":3,"3":4,"4":5,"5":8,"6":9,"7":11,"8":12,"9":13,"10":14,"11":15,"12":16,"13":17,"14":19,"15":20,"16":22,"17":24,"18":26,"19":27,"20":29,"21":30,"22":31,"23":32,"24":33,"25":34,"26":36,"27":39,"28":41,"29":42,"30":43,"31":44,"32":45,"33":46,"34":47,"35":48,"36":49,"37":51,"38":52,"39":55,"40":56,"41":57,"42":58,"43":60,"44":61,"45":63,"46":64,"47":65,"48":66,"49":67,"50":70,"51":72,"52":73,"53":74,"54":75,"55":78,"56":79,"57":80,"58":82,"59":83,"60":84,"61":85,"62":86,"63":87,"64":89,"65":90,"66":92,"67":94,"68":95,"69":96,"70":97,"71":98,"72":102,"73":105,"74":106,"75":107,"76":108,"77":109,"78":110,"79":111,"80":112,"81":114,"82":115,"83":116,"84":118,"85":119,"86":120,"87":121,"88":122,"89":123,"90":124,"91":126,"92":127,"93":128,"94":129,"95":132,"96":133,"97":134,"98":137,"99":138,"100":140,"101":141,"102":142,"103":144,"104":146,"105":147,"106":148,"107":149,"108":150,"109":152,"110":155,"111":157,"112":160,"113":161},"category":{"0":"MF Purchase","1":"Cash Withdrawal","2":"Transfer to Cred","3":"Transfer to PALI BARM","4":"Loan","5":"Small Savings","6":"Transfer to CTRAZORPAY","7":"Loan","8":"Transfer to EASTERN SERVICE S","9":"Cash Withdrawal","10":"Transfer to PALI BARM","11":"Transfer to Cred","12":"Personal Loan","13":"Transfer to TUHINA K","14":"Transfer to Wallet","15":"Transfer to MONEY VIEW","16":"Transfer to PALI BARM","17":"Transfer to SHANKAR D","18":"Cash Withdrawal","19":"Transfer to EMPIRE","20":"Loan","21":"Loan","22":"Tax","23":"Bank Charges","24":"Cash Withdrawal","25":"Transfer to DELUXE SERVICE","26":"Transfer to Wallet","27":"Cash Withdrawal","28":"Cash Withdrawal","29":"Transfer to PRASENJIT","30":"Transfer to SANJIB BA","31":"Transfer to Wallet","32":"Transfer to Wallet","33":"Cash Withdrawal","34":"Transfer to SHANTANU CARFIL","35":"Transfer to Wallet","36":"Transfer to Wallet","37":"Transfer to EARLYSALA","38":"MF Purchase","39":"Transfer to CRED","40":"Transfer to Kreditzy","41":"Transfer to Kreditzy","42":"Transfer to CTRAZORPAY","43":"Transfer to Mr SOUVIK","44":"Small Savings","45":"Loan","46":"Personal Loan","47":"Transfer to CRED","48":"Transfer to Wallet","49":"Utilities","50":"Transfer to WhizdmInn","51":"Transfer to KOLKATA METRO KAV","52":"Loan","53":"Transfer to TUMI ASBEY BOLE","54":"Transfer to Mahammad","55":"Transfer to khatabook","56":"Utilities","57":"Utilities","58":"Cash Withdrawal","59":"Tax","60":"Bank Charges","61":"Transfer to Wallet","62":"Transfer to Wallet","63":"Transfer to Shivam Ac","64":"Transfer to Wallet","65":"Transfer to Wallet","66":"Transfer to Wallet","67":"Transfer to SOUVIK M","68":"Transfer to HueyTechnolo","69":"MF Purchase","70":"Transfer to RAZORPAY SOFTW","71":"Transfer to Bank Acco","72":"Transfer to Wallet","73":"Transfer to Bank Acco","74":"Transfer to Wallet","75":"Small Savings","76":"Transfer to CTRAZORPAY","77":"Loan","78":"Transfer to SUPRIYA S","79":"Personal Loan","80":"Transfer to Wallet","81":"Cash Withdrawal","82":"Transfer to RazorpayZ","83":"Transfer to Wallet","84":"Transfer to CRED","85":"Transfer to RAJ","86":"Transfer to Mr SOUVIK","87":"Transfer to Mr SOUVIK","88":"Transfer to MONEY VIEW","89":"Loan","90":"Others","91":"Transfer to CRED","92":"Loan","93":"Transfer to GOBARDHAN","94":"Transfer to Mr SOUVIK","95":"Transfer to BIG BAZAAR","96":"Loan","97":"Transfer to Mr SOUVIK","98":"Transfer to delhivery","99":"Transfer to RazorpayZ","100":"Transfer to Mr SOUVIK","101":"Transfer to Mr SOUVIK","102":"Transfer to KOLKATA METRO KAV","103":"Utilities","104":"Cash Withdrawal","105":"Transfer to Wallet","106":"Transfer to WOW MOMO KOLKATA","107":"Utilities","108":"Transfer to SANJIB BA","109":"Cash Withdrawal","110":"Transfer to MD SHAHID","111":"Transfer to GOBARDHAN","112":"Transfer to EarlySala","113":"Others"}}'
df = pd.read_json(json_str)
df.loc[:, 'category'] = pd.Categorical(df['category'], categories=sorted(set(df['category'].tolist()),key=str.lower))
print(df.sort_values(by=['category'])['category'])
При выполнении приведенного выше кода порядок сортировки не согласован. Это дает противоречивые результаты при каждом запуске. Пожалуйста, найдите ниже фрагмент из выходных данных.
При первом запуске
91 Transfer to CRED
47 Transfer to CRED
39 Transfer to CRED
84 Transfer to CRED
11 Transfer to Cred
2 Transfer to Cred
При втором/многократном запуске
11 Transfer to Cred
2 Transfer to Cred
91 Transfer to CRED
47 Transfer to CRED
39 Transfer to CRED
84 Transfer to CRED
Обратите внимание, что иногда Transfer to Cred
это происходит сверху, а иногда-снизу.
Ожидаемый результат
Я ожидаю, что каждый раз, когда я запускаю код, будет выводиться следующее.
11 Transfer to Cred
2 Transfer to Cred
91 Transfer to CRED
47 Transfer to CRED
39 Transfer to CRED
84 Transfer to CRED
Комментарии:
1. У меня нет такой проблемы с запуском вашего кода. Это все время дает мне ожидаемый результат
2. @Biarys Не могли бы вы, пожалуйста, попробовать запустить это, скажем, 5-6 раз и проверить, получаете ли вы каждый раз один и тот же результат.
3. Я сделал это в блокноте Jupyter и CMD. Ноутбук Jupyter стабильно выдает ожидаемый результат. CMD последовательно выдает результаты первого запуска. Если вы хотите получить разные результаты в разных средах, возможно, вам следует преобразовать столбец в нижний/верхний регистр, а затем отсортировать по нему
4. @Biarys Какая-либо конкретная причина этой разницы в поведении в ноутбуках CMD и Jupyter?
5. понятия не имею, почему он это делает