আমি কীভাবে নুমপাইতে রেকর্ড অ্যারে সিএসভি ডেটা পড়ব?


414

আমি ভাবছি অনেক ভাবে রেকর্ড অ্যারের মধ্যে একটি CSV ফাইলের বিষয়বস্তু আমদানি করতে একটি সরাসরি উপায় নেই, যে আর এর read.table(), read.delim()এবং read.csv()আর ডেটা ফ্রেম পরিবারের ডেটা আমদানি করে?

অথবা csv.reader () ব্যবহার করার সর্বোপরি উপায় এবং এর পরে কিছু প্রয়োগ করা যায় numpy.core.records.fromrecords()?


উত্তর:


645

কোয়ার্গকে কমাতে genfromtxt()সেট করে আপনি এটি করতে নিম্পির পদ্ধতিটি ব্যবহার করতে পারেন delimiter

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

ফাংশন সম্পর্কিত আরও তথ্য তার সম্পর্কিত ডকুমেন্টেশনে পাওয়া যাবে ।


10
আপনি যদি বিভিন্ন ধরণের কিছু চান? স্ট্রিং এবং ইনটসের মতো?
সিজি দিলেজেন্ড

11
@CGTheLegend np.genfromtxt ( 'myfile.csv', বিভেদক = ',', dtype = কোনটি)
chickensoup

2
numpy.loadtxt আমার জন্যও বেশ ভাল কাজ করেছে
Yibo Yang

10
আমি এটি চেষ্টা করেছিলাম তবে আমি কেবল nanমান পাচ্ছি , কেন? লোডটেক্সট সহ আমিও পাচ্ছি UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128)। আমার ইনপুট ডেটাতে ä এবং as এর মতো আমলাট রয়েছে।
এইচ এইচ

1
@hh encoding="utf8"যুক্তি যুক্ত করার চেষ্টা করুন । পাইথন হ'ল এমন কয়েকটি আধুনিক সফটওয়্যার পিস যা হ'ল পাঠ্য এনকোডিংয়ের সমস্যাগুলি ঘন ঘন ঘটা করে, যা অতীতের জিনিস হিসাবে মনে হয়।
শে

187

আমি গ্রন্থাগার read_csvথেকে ফাংশনটি সুপারিশ করব pandas:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

এটি একটি পান্ডাস ডেটাফ্রেম দেয় - অনেকগুলি দরকারী ডেটা ম্যানিপুলেশন ফাংশনগুলিকে মঞ্জুরি দেয় যা সরাসরি নপি রেকর্ড অ্যারেগুলির সাথে উপলব্ধ নয়

ডেটাফ্রেম সম্ভাব্য বিভিন্ন ধরণের কলাম সহ একটি 2-মাত্রিক লেবেলযুক্ত ডেটা কাঠামো। আপনি এটিকে কোনও স্প্রেডশিট বা এসকিউএল টেবিলের মতো ভাবতে পারেন ...


আমি সুপারিশ করবে genfromtxt। তবে, যেহেতু প্রশ্নটি একটি সাধারণ অ্যারের বিপরীতে রেকর্ড অ্যারে চেয়েছে , dtype=Noneতাই genfromtxtকলটিতে প্যারামিটার যুক্ত করা দরকার :

একটি ইনপুট ফাইল দেওয়া হয়েছে myfile.csv:

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')

একটি অ্যারে দেয়:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

এবং

np.genfromtxt('myfile.csv',delimiter=',',dtype=None)

একটি রেকর্ড অ্যারে দেয়:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

এটির সুবিধাটি রয়েছে যে একাধিক ডেটা ধরণের ফাইল (স্ট্রিং সহ) সহজেই আমদানি করা যায়


read_csv উদ্ধৃতিতে কমা দিয়ে কাজ করে। জেনফ্র্যামটেক্সটে এটির প্রস্তাব দিন
ভিয়েতনাম

3
মানগুলিতে প্রথম লাইনটি এড়ানোর জন্য শিরোনাম = 0 ব্যবহার করুন, যদি আপনার ফাইলটিতে 1-লাইন শিরোনাম থাকে
সি-শ্যাভেজ

মনে রাখবেন যে এটি একটি 2 ডি অ্যারে তৈরি করে: উদাঃ (1000, 1)np.genfromtxtএটি করে না: যেমন (1000,)
নিউজকুলার

74

আমি সময় শেষ

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

বনাম

import csv
import numpy as np
with open(dest_file,'r') as dest_f:
    data_iter = csv.reader(dest_f,
                           delimiter = delimiter,
                           quotechar = '"')
    data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)

প্রায় col০ টি কলাম সহ 4.6 মিলিয়ন সারিতে এবং সন্ধান পেয়েছে যে NumPy পাথ 2 মিনিট 16 সেকেন্ড সময় নিয়েছে এবং সিএসভি-তালিকা বোঝার পদ্ধতিটি 13 সেকেন্ড নিয়েছিল।

আমি সিএসভি-তালিকা বোঝার পদ্ধতিটি সুপারিশ করব কারণ এটি সম্ভবত প্রাক-সংকলিত লাইব্রেরিগুলিতে নির্ভর করে এবং নুমপি-র মতো দোভাষীর উপর নির্ভর করে না। আমি সন্দেহ করি পান্ডাস পদ্ধতিতে একই রকম দোভাষী ওভারহেড থাকবে।


23
আমি ২. similar মিলিয়ন সারি এবং ৮ টি কলামযুক্ত সিএসভি ফাইলের সাথে এর অনুরূপ কোডটি পরীক্ষা করেছি। numpy.recfromcsv () প্রায় 45 সেকেন্ড সময় নিয়েছে, এনপি.এসারারে (তালিকা (csv.reader ()) প্রায় 7 সেকেন্ড সময় নিয়েছিল এবং pandas.read_csv () প্রায় 2 সেকেন্ড (!) নিয়েছিল। (ফাইলটি সম্প্রতি সব ক্ষেত্রেই ডিস্ক থেকে পড়েছিল, সুতরাং এটি ইতিমধ্যে অপারেটিং সিস্টেমের ফাইল ক্যাশে ছিল)) আমি মনে করি আমি পান্ডাস নিয়ে যাব।
ম্যাথিয়াস ফ্রিপ 21

5
আমি কেবলমাত্র খেয়াল করেছি wesmckinney.com/blog/…পান্ডার ফাস্ট সিএসভি পার্সার ডিজাইন সম্পর্কে কিছু নোট রয়েছে । লেখক গতি এবং মেমরির প্রয়োজনীয়তাগুলি বেশ গুরুত্ব সহকারে নেন। প্যানডাস ডেটা ফ্রেমের পরিবর্তে পাইথন রেকর্ড অ্যারে হিসাবে ফলাফলটি সরাসরি পাওয়া সত্য হিসাবে as_recarray = ব্যবহার করা সম্ভব।
ম্যাথিয়াস ফ্রিপ 19

67

আপনি recfromcsv()যা চেষ্টা করতে পারেন যা ডেটা ধরণের অনুমান করতে পারে এবং সঠিকভাবে ফর্ম্যাট করা রেকর্ড অ্যারেটি ফিরিয়ে আনতে পারে।


9
আপনি যদি সিএসভিতে ক্রম / কলামের নামগুলি বজায় রাখতে চান তবে আপনি নিম্নলিখিত অনুরোধটি ব্যবহার করতে পারেন: numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')মূল যুক্তিগুলি শেষ তিনটি।
eacousineau

16

আমি যেমন NumPy এবং পান্ডাস ব্যবহার করে উভয় উপায়ে চেষ্টা করেছি, পান্ডাস ব্যবহারের অনেক সুবিধা রয়েছে:

  • দ্রুত
  • কম সিপিইউ ব্যবহার
  • নম্পপি জেনফ্র্যামটেক্সটের তুলনায় 1/3 র‍্যাম ব্যবহার

এটি আমার পরীক্ষার কোড:

$ for f in test_pandas.py test_numpy_csv.py ; do  /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps

23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps

test_numpy_csv.py

from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')

test_pandas.py

from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')

ফাইল তথ্য:

du -h ~/me/notebook/train.csv
 59M    /home/hvn/me/notebook/train.csv

সংস্করণগুলিতে NumPy এবং পান্ডাস সহ:

$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2

5

আপনি এই কোডটি একটি অ্যারেতে সিএসভি ফাইল ডেটা প্রেরণ করতে ব্যবহার করতে পারেন:

import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)

4

ব্যবহার numpy.loadtxt

একটি বেশ সহজ পদ্ধতি। তবে এর জন্য সমস্ত উপাদানগুলি ভাসমান হওয়া প্রয়োজন (ইনট ইত্যাদি)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)  

4

এই সবচেয়ে সহজ উপায়:

import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))

এখন ডেটা প্রতিটি এন্ট্রি একটি রেকর্ড, অ্যারে হিসাবে প্রতিনিধিত্ব। সুতরাং আপনি একটি 2D অ্যারে আছে। এটি আমার অনেক সময় বাঁচিয়েছিল।


পান্ডাদের সাথে কেন আমাদের ঘুরতে হবে, যখন এই সরঞ্জামগুলিতে এত কম বৈশিষ্ট্য ফুলে আছে?
ক্রিস্টোফার

3

আমি এটি চেষ্টা করেছি:

import pandas as p
import numpy as n

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)

3

আমি সারণী ( pip3 install tables) ব্যবহার করার পরামর্শ দেব । আপনি আপনার .csvফাইলকে .h5পান্ডাস ( pip3 install pandas) ব্যবহার করে সংরক্ষণ করতে পারেন ,

import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()

এরপরে আপনি সহজেই এবং অল্প সময়ের সাথে সাথে বিপুল পরিমাণ ডেটার জন্যও আপনার ডেটা একটি NumPy অ্যারে লোড করতে পারেন ।

import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()

# Data in NumPy format
data = data.values

3

কবজ হিসাবে এই কাজ ...

import csv
with open("data.csv", 'r') as f:
    data = list(csv.reader(f, delimiter=";"))

import numpy as np
data = np.array(data, dtype=np.float)

কোডটিকে তার কোড মার্কডাউন লেআউটের ভিতরে সঠিকভাবে ইন্টেন্ট করা দরকার।
সূরাজ 1 এন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.