पंडों के डेटाफ्रेम को इंट से स्ट्रिंग में परिवर्तित करना


107

मेरे पास पंडों में मिश्रित int और str डेटा कॉलम के साथ एक डेटाफ्रेम है। मैं डेटाफ़्रेम के भीतर पहले कॉलम को बदलना चाहता हूं। ऐसा करने के लिए मुझे एक intकॉलम को में बदलना होगा str। मैंने निम्नानुसार करने की कोशिश की है:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

या

mtrx['X.3'] = mtrx['X.3'].astype(str)

लेकिन दोनों मामलों में यह काम नहीं कर रहा है और मुझे यह कहते हुए एक त्रुटि हो रही है कि "स्ट्रैट 'और' इंट 'ऑब्जेक्ट्स को समाप्‍त नहीं कर सकते हैं।" दो strकॉलम को समेटना पूरी तरह से ठीक काम कर रहा है।


जवाबों:


139
In [16]: df = DataFrame(np.arange(10).reshape(5,2),columns=list('AB'))

In [17]: df
Out[17]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [18]: df.dtypes
Out[18]: 
A    int64
B    int64
dtype: object

एक श्रृंखला में परिवर्तित करें

In [19]: df['A'].apply(str)
Out[19]: 
0    0
1    2
2    4
3    6
4    8
Name: A, dtype: object

In [20]: df['A'].apply(str)[0]
Out[20]: '0'

परिणाम वापस असाइन करने के लिए मत भूलना:

df['A'] = df['A'].apply(str)

पूरे फ्रेम में कनवर्ट करें

In [21]: df.applymap(str)
Out[21]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [22]: df.applymap(str).iloc[0,0]
Out[22]: '0'

df = df.applymap(str)

3
मुझे वास्तव में समझ में नहीं आता है, लेकिन mtrx ['X.3']। लागू करें (str) मेरे लिए भी काम नहीं करता है :( dtype अभी भी int64 दिखाता है। 23177 पंक्ति और X.3 स्तंभ के लिए डेटाफ़्रेम केवल संख्याएँ मिलीं। [२१]: mtrx ['X.3']। dtype आउट [२१]: dtype ('int64')
११:४३ पर Malfet

0.7.0, उबंटू प्रणाली पर अजगर 2.7 के साथ आते हैं
Malfet

वर्तमान संस्करण 0.12 है, आपको अपग्रेड करना चाहिए।
जेफ

df ['A']। लागू करें (str) काम नहीं कर रहा है। लेकिन df.column_name = df.column_name.astype (str) कार्य करता है। पता नहीं क्यों।
दिमित्री कोनोवलोव

1
अजगर तारों में @DmitryKonovalov अपरिवर्तनीय हैं, इसलिए जब भी आप डेटा में हेरफेर करते हैं, तो आपको परिणाम को वापस चर में डालना होगा।
श्रीराम अरविंद

92

डेटा प्रकार डेटा स्तंभ बदलें:

इंट करने के लिए:

df.column_name = df.column_name.astype(np.int64)

तार करने के लिए:

df.column_name = df.column_name.astype(str)


7
यह अपील कर रहा है, लेकिन यह apply(str)मेरे परीक्षण का उपयोग करके, @Jeff से लगभग 4x धीमा है pd.Series(np.arange(1000000))
जॉन Zwinck

2
यह मेरे लिए काम करता है। df['A'] = df['A'].apply(str)भी काम करता है। @ जेफ़ द्वारा प्रदान किया गया उत्तर मेरे लिए काम नहीं करता है।
tommy.carstensen

1
के बारे में @ JohnZwinck की टिप्पणी, python3 का उपयोग कर इसे उपयोग करने के लिए 2x की तरह अधिक तेजी से हो रहा है apply()के बजाय astype(): timeit.Timer ( 'c.apply (एसटीआर)', सेटअप = 'पीडी के रूप में आयात पांडा; सीमा c = pd.Series (( 1000))))।) समयसीमा (1000) >>> 0.41499893204309046 >>> timeit.Timer ('c.astype (str)', setup = 'pand के रूप में आयात पांडा; c = pd.Series (रेंज (1000))') ) .समय (१०००) ०.44००४४३

15

चेतावनी : दोनों समाधान दिया ( astype () और लागू () ) या तो नेन या कोई नहीं के रूप में शून्य मान की रक्षा नहीं है।

import pandas as pd
import numpy as np

df = pd.DataFrame([None,'string',np.nan,42], index=[0,1,2,3], columns=['A'])

df1 = df['A'].astype(str)
df2 =  df['A'].apply(str)

print df.isnull()
print df1.isnull()
print df2.isnull()

मेरा मानना ​​है कि यह to_string () के कार्यान्वयन से तय होता है


1
to_string आपको 'Nan' के बजाय खाली स्ट्रिंग वापस करने के लिए Nan उदाहरण के लिए हैंडलिंग की अनुमति देता है
seanv507

1
(मैं असहमत नहीं था, आपने जो कहा, उस पर विस्तार करते हुए) - 1 को कहना चाहता था
seanv507


0

बस एक अतिरिक्त संदर्भ के लिए।

उपरोक्त सभी उत्तर डेटा फ्रेम के मामले में काम करेंगे। लेकिन यदि आप एक कॉलम बनाते / संशोधित करते समय लैम्ब्डा का उपयोग कर रहे हैं तो यह काम नहीं करेगा, क्योंकि वहां इसे पैंसिल श्रृंखला के बजाय एक अंतर विशेषता माना जाता है। इसे स्ट्रिंग के रूप में बनाने के लिए आपको str (target_attribute) का उपयोग करना होगा। कृपया नीचे दिए गए उदाहरण को देखें।

def add_zero_in_prefix(df):
    if(df['Hour']<10):
        return '0' + str(df['Hour'])

data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.