पंडों में फ़्लोट्स में तब्दील करें?


230

मैं CSV से आयातित डेटा के साथ काम कर रहा हूं। पंडों ने कुछ स्तंभों को तैरने के लिए बदल दिया, इसलिए अब इन स्तंभों में संख्याओं को अस्थायी बिंदुओं के रूप में प्रदर्शित किया जाता है! हालाँकि, मुझे उन्हें पूर्णांक के रूप में प्रदर्शित करने की आवश्यकता है, या, अल्पविराम के बिना। क्या उन्हें पूर्णांक में बदलने या अल्पविराम प्रदर्शित करने का कोई तरीका नहीं है?


22
आप प्रकार बदल सकते हैं (इसलिए जब तक कोई लापता मान न हो)df.col = df.col.astype(int)
EdChum

यह प्रश्न एक ही समय में दो प्रश्न हैं, और इस प्रश्न का शीर्षक उनमें से केवल एक को दर्शाता है।
मोनिका हेडडेक

: एक लोगों के ऊपर मार रहा है और अवधारणा में उपयोगी इसे ढूंढने में लेकिन आप के लिए काम नहीं कर के लिए, इस संस्करण है कि पांडा के साथ अजगर 3.7.5 में मेरे लिए काम किया एक्सdf = df.astype(int)
Oliver.R

जवाबों:


216

फ्लोट आउटपुट को संशोधित करने के लिए ऐसा करें:

df= pd.DataFrame(range(5), columns=['a'])
df.a = df.a.astype(float)
df

Out[33]:

          a
0 0.0000000
1 1.0000000
2 2.0000000
3 3.0000000
4 4.0000000

pd.options.display.float_format = '{:,.0f}'.format
df

Out[35]:

   a
0  0
1  1
2  2
3  3
4  4

16
धन्यवाद! मैंने इसे अपने in_csv: fin.to_csv ('my_table.csv', float_format = '%। F') में समायोजित किया। इसने काम कर दिया!
एमजेपी

4
पंडों के नवीनतम संस्करण में आपको एक चेतावनी से बचने के लिए प्रति = असत्य के तर्कों को गलत जोड़ने की आवश्यकता है
g.stevo

क्या यह करना आवश्यक है df.a = df.a.astype(float)? क्या यह एक प्रतिलिपि बनाता है (यह सुनिश्चित नहीं है कि copyपरम astype()का उपयोग कैसे किया जाता है)? वैसे भी "जगह में" अद्यतन करने के लिए?
Mr_and_Mrs_D

1
@EdChum, क्या पंडों को शुरुआत से टाइप करने के लिए परिवर्तित करने से रोकने का कोई तरीका है? उदाहरण के लिए, प्रयास करें DF.({'200': {'#': 354, '%': 0.9971830985915493}, '302': {'#': 1, '%': 0.0028169014084507044}}) नोट # फ्लोट में परिवर्तित हो गया और वे पंक्तियाँ हैं, कॉलम नहीं। क्योंकि प्रत्येक वह है Seriesजो केवल एक ही समान प्रकार को स्टोर कर सकता है?
अलंकलवित्ति

@alancalvitti मूल्यों को संरक्षित करने के लिए यहां आपका इरादा क्या है या dtype? यदि यह है dtypeतो आपको उन स्तंभों को बनाने की आवश्यकता है क्योंकि dtype objectयह मिश्रित की अनुमति देता है, अन्यथा मेरी सलाह सिर्फ फ्लोट का उपयोग करना होगा और तुलना करते समय उपयोग करना होगाnp.isclose
EdChum

180

pandas.DataFrame.astype(<type>)स्तंभ dtypes में हेरफेर करने के लिए फ़ंक्शन का उपयोग करें।

>>> df = pd.DataFrame(np.random.rand(3,4), columns=list("ABCD"))
>>> df
          A         B         C         D
0  0.542447  0.949988  0.669239  0.879887
1  0.068542  0.757775  0.891903  0.384542
2  0.021274  0.587504  0.180426  0.574300
>>> df[list("ABCD")] = df[list("ABCD")].astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0

संपादित करें:

लापता मूल्यों को संभालने के लिए:

>>> df
          A         B     C         D
0  0.475103  0.355453  0.66  0.869336
1  0.260395  0.200287   NaN  0.617024
2  0.517692  0.735613  0.18  0.657106
>>> df[list("ABCD")] = df[list("ABCD")].fillna(0.0).astype(int)
>>> df
   A  B  C  D
0  0  0  0  0
1  0  0  0  0
2  0  0  0  0

3
मैंने आपके दृष्टिकोण की कोशिश की और यह मुझे एक मूल्य प्रदान करता है: एनए को पूर्णांक में परिवर्तित नहीं कर सकता
एमजेपी

6
@MJP आप फ़्लोट से पूर्णांक तक श्रृंखला को परिवर्तित नहीं कर सकते हैं यदि लापता मान pandas.pydata.org/pandas-docs/stable/… देखें , तो आपको फ़्लोट्स का उपयोग करना होगा
EdChum

2
मान गायब नहीं हैं, लेकिन स्तंभ उद्देश्य पर प्रत्येक पंक्ति के लिए कोई मान निर्दिष्ट नहीं करता है। क्या वर्कअराउंड हासिल करने का कोई तरीका है? चूंकि वे मूल्य विदेशी कुंजी आईडी हैं, इसलिए मुझे इनट्स की आवश्यकता है।
MJP

4
मैंने एक संपादन किया है जिसमें सभी NaN एक 0.0 के साथ बदल दिए गए हैं।
रयान जी

3
या बेहतर अभी तक, यदि आप केवल एक CSV को संशोधित कर रहे हैं, तो: df.to_csv ("path.csv", na_rep = "", float_format = "%। 0f", index = False ... लेकिन यह सभी फ़्लोट को संपादित करेगा, इसलिए अपने FK कॉलम को स्ट्रिंग में बदलना, हेरफेर करना और फिर सहेजना बेहतर हो सकता है।
रयान जी

44

निम्नलिखित डेटा फ़्रेम को ध्यान में रखते हुए:

>>> df = pd.DataFrame(10*np.random.rand(3, 4), columns=list("ABCD"))
>>> print(df)
...           A         B         C         D
... 0  8.362940  0.354027  1.916283  6.226750
... 1  1.988232  9.003545  9.277504  8.522808
... 2  1.141432  4.935593  2.700118  7.739108

स्तंभ नामों की सूची का उपयोग करते हुए, कई स्तंभों के लिए प्रकार बदलें applymap():

>>> cols = ['A', 'B']
>>> df[cols] = df[cols].applymap(np.int64)
>>> print(df)
...    A  B         C         D
... 0  8  0  1.916283  6.226750
... 1  1  9  9.277504  8.522808
... 2  1  4  2.700118  7.739108

या इसके साथ एकल कॉलम के लिए apply():

>>> df['C'] = df['C'].apply(np.int64)
>>> print(df)
...    A  B  C         D
... 0  8  0  1  6.226750
... 1  1  9  9  8.522808
... 2  1  4  2  7.739108

5
यदि मूल्य में कोई NaN है तो क्या होगा?
झांग 18

3
@ Zhang18 मैंने इस समाधान की कोशिश की और NaN के मामले में आपको यह त्रुटि है:ValueError: ('cannot convert float NaN to integer', u'occurred at index <column_name>')
en

2
@ हेनरी: निम्नलिखित कोड की कोशिश कर सकते हैं -df['C'] = df['C'].dropna().apply(np.int64)
बनाम

12

यह एक त्वरित समाधान है यदि आप अपने pandas.DataFrameफ्लोट से पूर्णांक में अधिक कॉलम को इस बात पर भी विचार करना चाहते हैं कि आपके पास NaN मान हो सकता है।

cols = ['col_1', 'col_2', 'col_3', 'col_4']
for col in cols:
   df[col] = df[col].apply(lambda x: int(x) if x == x else "")

मैंने कोशिश की else x)और else None), लेकिन परिणाम अभी भी फ्लोट संख्या में है, इसलिए मैंने उपयोग किया else ""


यह ""सभी मूल्यों पर लागू होगाcol
रहेल

यह सभी लापता मानों के लिए रिक्त स्ट्रिंग ("") लागू करेगा, यदि ऐसा है तो इसकी आवश्यकता है, लेकिन शेष मान पूर्णांक होंगे।
Krzysztof Słowiński

इसके लिए धन्यवाद। यह तब काम किया जब .astype () और .apply (np.int64) ने नहीं किया।
एलिसन एस

यह हैकिंग महसूस करता है, और मुझे उपलब्ध कई विकल्पों पर इसका उपयोग करने का कोई कारण नहीं दिखता है।
एएमसी

8

@ Gyan G की pandas.DataFrame.astype(<type>)विधि के उपयोग पर विस्तार करते हुए , errors=ignoreतर्क का उपयोग केवल उन स्तंभों को परिवर्तित करने के लिए किया जा सकता है जो त्रुटि उत्पन्न नहीं करते हैं, जो विशेष रूप से वाक्य रचना को सरल बनाता है। जाहिर है, त्रुटियों को नजरअंदाज करते समय सावधानी बरतनी चाहिए, लेकिन इस कार्य के लिए यह बहुत काम आता है।

>>> df = pd.DataFrame(np.random.rand(3, 4), columns=list('ABCD'))
>>> df *= 10
>>> print(df)
...           A       B       C       D
... 0   2.16861 8.34139 1.83434 6.91706
... 1   5.85938 9.71712 5.53371 4.26542
... 2   0.50112 4.06725 1.99795 4.75698

>>> df['E'] = list('XYZ')
>>> df.astype(int, errors='ignore')
>>> print(df)
...     A   B   C   D   E
... 0   2   8   1   6   X
... 1   5   9   5   4   Y
... 2   0   4   1   4   Z

से pandas.DataFrame.astype डॉक्स:

त्रुटियाँ: {'उठाना', 'अनदेखा करना'}, डिफ़ॉल्ट 'उठाना'

प्रदान किए गए dtype के लिए अमान्य डेटा पर अपवादों को नियंत्रित करना।

  • बढ़ाएँ: अपवादों को बढ़ाने की अनुमति दें
  • उपेक्षा: अपवादों को दबाएं। त्रुटि पर मूल वस्तु वापस करें

संस्करण में नया 0.20.0।


7
>>> import pandas as pd
>>> right = pd.DataFrame({'C': [1.002, 2.003], 'D': [1.009, 4.55], 'key': ['K0', 'K1']})
>>> print(right)
           C      D key
    0  1.002  1.009  K0
    1  2.003  4.550  K1
>>> right['C'] = right.C.astype(int)
>>> print(right)
       C      D key
    0  1  1.009  K0
    1  2  4.550  K1

5

सभी फ्लोट कॉलम को इंट में बदलने के लिए

>>> df = pd.DataFrame(np.random.rand(5, 4) * 10, columns=list('PQRS'))
>>> print(df)
...     P           Q           R           S
... 0   4.395994    0.844292    8.543430    1.933934
... 1   0.311974    9.519054    6.171577    3.859993
... 2   2.056797    0.836150    5.270513    3.224497
... 3   3.919300    8.562298    6.852941    1.415992
... 4   9.958550    9.013425    8.703142    3.588733

>>> float_col = df.select_dtypes(include=['float64']) # This will select float columns only
>>> # list(float_col.columns.values)
>>> for col in float_col.columns.values:
...     df[col] = df[col].astype('int64')
>>> print(df)
...     P   Q   R   S
... 0   4   0   8   1
... 1   0   9   6   3
... 2   2   0   5   3
... 3   3   8   6   1
... 4   9   9   8   3

0

यहां एक सरल फ़ंक्शन है जो डाउनकास्ट करेगा सबसे छोटी संभव पूर्णांक प्रकार में तैरता है जो किसी भी जानकारी को नहीं खोता है। उदाहरण के लिए,

  • 100.0 को फ्लोट से पूर्णांक में परिवर्तित किया जा सकता है, लेकिन 99.9 (राउंडिंग या ट्रंकेशन की जानकारी खोए बिना) नहीं हो सकता

  • इसके अतिरिक्त, 1.0 int8बिना जानकारी खोए सभी तरह से डाउनकास्ट किया जा सकता है , लेकिन 100_000.0 के लिए सबसे छोटा पूर्णांक प्रकार हैint32

कोड उदाहरण:

import numpy as np
import pandas as pd

def float_to_int( s ):
    if ( s.astype(np.int64) == s ).all():
        return pd.to_numeric( s, downcast='integer' )
    else:
        return s

# small integers are downcast into 8-bit integers
float_to_int( np.array([1.0,2.0]) )
Out[1]:array([1, 2], dtype=int8)

# larger integers are downcast into larger integer types
float_to_int( np.array([100_000.,200_000.]) )
Out[2]: array([100000, 200000], dtype=int32)

# if there are values to the right of the decimal
# point, no conversion is made
float_to_int( np.array([1.1,2.2]) )
Out[3]: array([ 1.1,  2.2])

0

जिन कॉलमों को इंट में बदलने की आवश्यकता है, उन्हें नीचे दिए गए शब्दकोश में भी उल्लेख किया जा सकता है

df = df.astype({'col1': 'int', 'col2': 'int', 'col3': 'int'})

-5
>>> df_18['cyl'].value_counts()
... 4.0     365
... 6.0     246
... 8.0     153

>>> df_18['cyl'] = df_18['cyl'].astype(int)
>>> df_18['cyl'].value_counts()
... 4     365
... 6     246
... 8     153

1
astype(int)पहले ही कई बार उल्लेख किया गया था। यह उत्तर कुछ नया नहीं जोड़ता है।
जार्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.