পান্ডসে ফ্লোটকে ইনটসে রূপান্তর করবেন?


230

আমি একটি সিএসভি থেকে আমদানি করা ডেটা নিয়ে কাজ করছি। পান্ডারা কিছু কলামকে ভাসতে বদলেছে, সুতরাং এখন এই কলামগুলির সংখ্যাগুলি ভাসমান পয়েন্ট হিসাবে প্রদর্শিত হবে! যাইহোক, আমার এগুলি পূর্ণরূপ হিসাবে প্রদর্শিত হতে পারে, বা কমা ছাড়াই। তাদের পূর্ণসংখ্যায় রূপান্তর করার বা কমা প্রদর্শন না করার কোনও উপায় আছে কি?


22
আপনি প্রকারটি পরিবর্তন করতে পারেন (যতক্ষণ না কোনও অনুপস্থিত মান নেই)df.col = df.col.astype(int)
এডচুম

এই প্রশ্নটি একই সাথে দুটি প্রশ্ন এবং এই প্রশ্নের শিরোনাম তাদের মধ্যে কেবল একটিকে প্রতিফলিত করে।
মনিকা হেডনেক

কোনও ব্যক্তির উপরের দিকে আঘাত করা এবং এটি ধারণায় কার্যকর হিসাবে খুঁজে পেয়েছে কিন্তু আপনার জন্য কাজ করছে না, এই সংস্করণটি আমার জন্য পাইডন এক্স with.7.৫ এ কাজ করেছিল:df = df.astype(int)
অলিভার.আর ২

উত্তর:


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
ধন্যবাদ! আমি এটিকে আমার টু_সিএসভিতে সমন্বয় করেছি: Fin.to_csv ('my_table.csv', float_format = '%। F')। এটা কাজ করেছে!
এমজেপি

4
পান্ডার সর্বশেষতম সংস্করণে আপনাকে সতর্কতা এড়াতে অস্টাইপের যুক্তিগুলিতে অনুলিপি = অনুলিপি যুক্ত করতে হবে
g.stevo

এটা করা দরকার df.a = df.a.astype(float)? এই একটি কপি করতে না (নিশ্চিত কিভাবে copyকরতে PARAM astype()ব্যবহার করা হয়)? যাইহোক "জায়গায় জায়গায়" টাইপ আপডেট করবেন?
মিস্টার_আর_ম্রি_ডিজ

1
@ এডচাম, পান্ডাদের ধরণের রূপান্তর থেকে শুরু করার কোনও উপায় আছে কি? উদাহরণস্বরূপ চেষ্টা DF.({'200': {'#': 354, '%': 0.9971830985915493}, '302': {'#': 1, '%': 0.0028169014084507044}}) করুন # টি ফ্লোটে রূপান্তরিত হন এবং সেগুলি সারি, কলাম নয়। যেহেতু প্রত্যেকে Seriesকেবলমাত্র একটি একক ইউনিফর্ম সংরক্ষণ করতে পারে?
অ্যালাঙ্কলভিটি

@ আলাঙ্কালভিট্টি এখানে মানগুলি বা সংরক্ষণ করার জন্য আপনার উদ্দেশ্য কী dtype? যদি এটি হয় dtypeতবে আপনাকে dtype objectnp.isclose
সেইগুলি

180

pandas.DataFrame.astype(<type>)কলামটি টাইপগুলি পরিচালনা করতে ফাংশনটি ব্যবহার করুন ।

>>> 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
@ এমজেপি আপনি ভাসা থেকে পূর্ণসংখ্যায় রূপান্তর করতে পারবেন না যদি মানগুলি অনুপস্থিত থাকে তবে পান্ডাস.পিডিটা.আর.দেখুন / প্যানডাস-ডকস / স্টেবল /… দেখুন , আপনাকে ফ্লোট ব্যবহার করতে হবে
এডচাম

2
মানগুলি অনুপস্থিত নয়, তবে কলামটি প্রতিটি সারিটির উদ্দেশ্যে উদ্দেশ্য উল্লেখ করে না। একটি কার্যকারিতা অর্জন করার কোন উপায় আছে? যেহেতু এই মানগুলি বিদেশী কী আইডস, তাই আমার ইনটগুলি দরকার।
এমজেপি

4
আমি একটি সম্পাদনা করেছি যেখানে সমস্ত NaN এর সাথে প্রতিস্থাপন করা হয়েছে ০.০।
রায়ান জি

3
বা আরও ভাল, যদি আপনি কেবল একটি সিএসভি পরিবর্তন করে থাকেন তবে: df.to_csv ("path.csv", na_rep = "", float_format = "%। 0f", সূচক = মিথ্যা) তবে এটি সমস্ত ফ্লোটগুলি সম্পাদনা করবে, তাই আপনার এফকে কলামটি স্ট্রিংয়ে রূপান্তর করা, ম্যানিপুলেশনটি করা, এবং তারপরে সেভ করা ভাল।
রায়ান জি

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
@ ঝাং 18 আমি এই সমাধানটি চেষ্টা করেছি এবং NaN এর ক্ষেত্রে আপনার এই ত্রুটি রয়েছে:ValueError: ('cannot convert float NaN to integer', u'occurred at index <column_name>')
এনরি

2
@ এরি: নিম্নলিখিত কোডটি চেষ্টা করে দেখতে পারেন -df['C'] = df['C'].dropna().apply(np.int64)

12

আপনি যদি আপনার আরও বেশি কলামগুলি pandas.DataFrameভাসমান থেকে পূর্ণসংখ্যায় রূপান্তর করতে চান তবে এটি একটি দ্রুত সমাধান যা আপনি এনএএন মান থাকতে পারে এমন ক্ষেত্রে বিবেচনা করে।

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

@ রায়ান জি 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

পান্ডাস.ডাটা ফ্রেম.স্টাস্টাইপ ডক্স থেকে :

ত্রুটি: raise 'উত্থাপন', 'উপেক্ষা'}, ডিফল্ট 'উত্থাপন'

প্রদত্ত dtype এর জন্য অবৈধ ডেটাতে ব্যতিক্রম বৃদ্ধি নিয়ন্ত্রণ করে Control

  • উত্থাপন: ব্যতিক্রম উত্থাপন করার অনুমতি দিন
  • উপেক্ষা: ব্যতিক্রম দমন। ত্রুটিতে ফিরে আসল বস্তুটি

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

এখানে একটি সাধারণ ফাংশন যা ক্ষুদ্রতম সম্ভাব্য পূর্ণসংখ্যার প্রকারে কোনও তথ্য হারাবে না তা ভরাট করবে। উদাহরন স্বরূপ,

  • ১০০.০ ভাসা থেকে পূর্ণসংখ্যায় রূপান্তরিত করা যায়, তবে ৯৯.৯ পারবেন না (তথ্যকে গোল করে বা কাটাতে না ছাড়াই)

  • অতিরিক্তভাবে, 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)ইতিমধ্যে বেশ কয়েকবার উল্লেখ করা হয়েছিল। এই উত্তরটি নতুন কিছু যুক্ত করে না।
জর্জি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.