पंडों में स्ट्रिंग को कॉलम में परिवर्तित करें


179

मेरे पास SQL ​​क्वेरी से निम्न DataFrame है:

(Pdb) pp total_rows
     ColumnID  RespondentCount
0          -1                2
1  3030096843                1
2  3030096845                1

और मैं इसे इस तरह से पिवट करना चाहता हूं:

total_data = total_rows.pivot_table(cols=['ColumnID'])

(Pdb) pp total_data
ColumnID         -1            3030096843   3030096845
RespondentCount            2            1            1

[1 rows x 3 columns]


total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]

{3030096843: 1, 3030096845: 1, -1: 2}

लेकिन मैं यह सुनिश्चित करना चाहता हूं कि 303 स्तंभों को पूर्णांक के बजाय तार के रूप में डाला जाए ताकि मुझे यह मिल जाए:

{'3030096843': 1, '3030096845': 1, -1: 2}

जवाबों:


332

स्ट्रिंग में परिवर्तित करने का एक तरीका है, astype का उपयोग करना :

total_rows['ColumnID'] = total_rows['ColumnID'].astype(str)

हालाँकि, शायद आप to_jsonफ़ंक्शन की तलाश कर रहे हैं , जो कुंजी को वैध जोंस में परिवर्तित कर देगा (और इसलिए आपकी कुंजी स्ट्रिंग के लिए):

In [11]: df = pd.DataFrame([['A', 2], ['A', 4], ['B', 6]])

In [12]: df.to_json()
Out[12]: '{"0":{"0":"A","1":"A","2":"B"},"1":{"0":2,"1":4,"2":6}}'

In [13]: df[0].to_json()
Out[13]: '{"0":"A","1":"A","2":"B"}'

नोट: आप इसे बचाने के लिए एक बफर / फ़ाइल में पास कर सकते हैं, साथ ही कुछ अन्य विकल्प ...


3
मुझे लगता है कि to_string () NULLs के संरक्षण की वजह से बेहतर है stackoverflow.com/a/44008334/3647167
कीथ

1
@ कीथ नल संरक्षण आकर्षक है। लेकिन डॉक्टर का कहना है कि इसका उद्देश्य 'रेंडर अ डेटाफ्रेम टू कंसोल-फ्रेंडली टेबलुलर आउटपुट' है। मैं किसी व्यक्ति को वजन कम करना चाहता हूँ
3pitt

to_json()शायद यह कॉल नहीं करता है astype(str)क्योंकि यह युगांतर के बाद से मिलीसेकंड के रूप में डेटाटाइम और उसके उपवर्गों को छोड़ देता है।
सूसच

1
@ मुझे शक है कि क्योंकि json के पास एक स्पष्ट डेटाटाइम प्रारूप नहीं है, इसलिए आप थोड़े समय के लिए उपयोग करने के लिए मजबूर हैं। जो कहना है, मुझे लगता है कि यह मानक है।
एंडी हेडन

49

यदि आपको सभी स्तंभों को स्ट्रिंग्स में बदलने की आवश्यकता है, तो आप बस उपयोग कर सकते हैं:

df = df.astype(str)

यह उपयोगी है यदि आपको तार / ऑब्जेक्ट होने के लिए कुछ स्तंभों को छोड़कर सब कुछ चाहिए, तो वापस जाएं और अन्य लोगों को आपकी ज़रूरत के अनुसार परिवर्तित करें (इस मामले में पूर्णांक):

 df[["D", "E"]] = df[["D", "E"]].astype(int) 

28

यहाँ केवल एक कॉलम के बजाय कई कॉलम को स्ट्रिंग में बदलने के लिए विशेष रूप से उपयोगी है :

In [76]: import numpy as np
In [77]: import pandas as pd
In [78]: df = pd.DataFrame({
    ...:     'A': [20, 30.0, np.nan],
    ...:     'B': ["a45a", "a3", "b1"],
    ...:     'C': [10, 5, np.nan]})
    ...: 

In [79]: df.dtypes ## Current datatype
Out[79]: 
A    float64
B     object
C    float64
dtype: object

## Multiple columns string conversion
In [80]: df[["A", "C"]] = df[["A", "C"]].astype(str) 

In [81]: df.dtypes ## Updated datatype after string conversion
Out[81]: 
A    object
B    object
C    object
dtype: object


0

का उपयोग करते हुए .apply()एक साथ lambdaरूपांतरण समारोह भी इस मामले में काम करता है:

total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))

संपूर्ण डेटाफ़्रेम के लिए आप उपयोग कर सकते हैं .applymap()। (लेकिन किसी भी मामले में शायद .astype()तेज है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.