मैं विशिष्ट कॉलम में मान के अनुसार पांडा डेटा फ़ाइल में स्ट्रिंग्स को कैसे सॉर्ट कर सकता हूं? [डुप्लिकेट]

Dec 02 2020

मेरा पायथन कार्यक्रम पंडों प्रारूप में एक डेटा फ़ाइल उत्पन्न करता है

        Source    LogP    MolWt  HBA  HBD
0        cne_1  1.1732  263.405    3    1
1       cne_10  2.6639  197.237    2    0
2      cne_100 -0.2886  170.193    4    2
3     cne_1000  1.9644  304.709    5    1
4     cne_1001  1.4986  162.144    3    1
...        ...     ...      ...  ...  ...
1031   cne_995  3.0179  347.219    4    2
1032   cne_996  4.8419  407.495    6    2
1033   cne_997  3.3560  354.524    3    1
1034   cne_998  7.5465  635.316    4    2
1035   cne_999  3.3514  389.556    4    1

मुझे संख्या के अनुसार दूसरे (स्रोत) कॉलम के आधार पर तार को क्रमबद्ध करने की आवश्यकता है, इसलिए छँटाई के बाद लाइनों का सही क्रम होना चाहिए: cne_1, cne_2, cne_3, cne_4 et मैंने उपयोग करने की कोशिश की है:

df_sorted = df.sort_values('Source', ascending=True)

लेकिन इसने लाइनों के क्रम में कोई परिवर्तन नहीं किया।

जवाब

5 jezrael Dec 02 2020 at 19:10

अंतिम पांडा संस्करणों के लिए संभव है कि पूर्णांक मानों को keyविभाजित करके _और मानों को पूर्णांकों में परिवर्तित करके पैरामीटर का उपयोग करें :

df_sorted = df.sort_values('Source', key=lambda x: x.str.split('_').str[1].astype(int)) 

या संभव है कि इसके द्वारा सॉर्ट किए गए मानों की स्थिति प्राप्त Series.argsortकरें DataFrame.iloc:

df_sorted = df.iloc[df['Source'].str.split('_').str[1].astype(int).argsort()]
print (df_sorted)
        Source    LogP    MolWt  HBA  HBD
0        cne_1  1.1732  263.405    3    1
1       cne_10  2.6639  197.237    2    0
2      cne_100 -0.2886  170.193    4    2
1031   cne_995  3.0179  347.219    4    2
1032   cne_996  4.8419  407.495    6    2
1033   cne_997  3.3560  354.524    3    1
1034   cne_998  7.5465  635.316    4    2
1035   cne_999  3.3514  389.556    4    1
3     cne_1000  1.9644  304.709    5    1
4     cne_1001  1.4986  162.144    3    1
3 Vishnudev Dec 02 2020 at 19:10

स्तंभ में पूर्णांक मान प्राप्त करें और फिर उसका उपयोग करके सॉर्ट करें।

df['sortIndex'] = df.Source.str.replace('cne_', '', regex=False).astype(int)
df_sorted = df.sort_values('sortIndex', ascending=True)
2 BillHuang Dec 02 2020 at 19:10

अंकों को निकालें, तदनुसार अंतर और क्रमबद्ध करें। ( .sort_values(0)क्योंकि अनाम स्तंभ अपने आप नाम हो 0जाता है)

df_sorted = df.loc[df["Source"].str.extract(r"_(\d+)").astype(int).sort_values(0).index]

परिणाम

print(df_sorted)
        Source    LogP    MolWt  HBA  HBD
0        cne_1  1.1732  263.405    3    1
1       cne_10  2.6639  197.237    2    0
2      cne_100 -0.2886  170.193    4    2
1031   cne_995  3.0179  347.219    4    2
1032   cne_996  4.8419  407.495    6    2
1033   cne_997  3.3560  354.524    3    1
1034   cne_998  7.5465  635.316    4    2
1035   cne_999  3.3514  389.556    4    1
3     cne_1000  1.9644  304.709    5    1
4     cne_1001  1.4986  162.144    3    1