मैं अजगर में अपेक्षाकृत नया हूँ। यहाँ मैं क्या करना चाहता हूँ। मुझे कई सीएसवी फाइलों (2018.csv, 2017.csv, 2016.csv,... आदि) के साथ एक फ़ोल्डर मिला है, 500 सीएसवी फाइलें सटीक होने के लिए। प्रत्येक CSV फ़ाइल में हेडर "date", "Code", "Cur", "Price" आदि शामिल हैं। मैं सभी 500 CSV फ़ाइलों को एक में जोड़ना चाहता हूं डेटा फ़ेम। यहाँ एक csv फ़ाइल के लिए मेरा कोड है, लेकिन यह बहुत धीमा है। मैं इसे सभी 500 फाइलों के लिए करना चाहता हूं और एक डेटाफ्रेम से जोड़ना चाहता हूं:

DB_2017 = pd.read_csv("C:/folder/2018.dat",sep=",", header =None).iloc[: 0,4,5,6]

DB_2017.columns =["date","Code","Cur",Price]

DB_2017['Code'] =DB_2017['Code'].map(lambdax:x.lstrip('@').rstrip('@'))

DB_2017['Cur'] =DB_2017['Cur'].map(lambdax:x.lstrip('@').rstrip('@'))

DB_2017['date'] =DB_2017['date'].apply(lambdax:pd.timestamp(str(x)[:10)

DB_2017['Price'] =pd.to_numeric(DB_2017.Price.replace(',',';')
0
KIKI99 18 जिंदा 2020, 22:11
एसओ में आपका स्वागत है! पांडा के प्रश्नों को पोस्ट करने के तरीके के बारे में पढ़ने के लिए कृपया कुछ समय दें: stackoverflow.com/questions/20109391/…
 – 
YOLO
18 जिंदा 2020, 22:15
क्या आपने पांडा डॉक्स पढ़ा है? आप सीधे pandas.read_csv() में कॉलम नाम निर्दिष्ट कर सकते हैं। कॉलम से वर्णों को अलग करने के लिए आपको मानचित्र और लैम्ब्डा की आवश्यकता नहीं है।
 – 
AMC
18 जिंदा 2020, 22:45

2 जवाब

आप निम्न कार्य कर सकते हैं:

def clean_up(df):
    df = df.iloc[:,[0,4,5,6]]
    df.columns = ["date","Code","Cur","Price"]
    df['Code'] = df['Code'].map(lambda x:x.lstrip('@').rstrip('@'))
    df['Cur'] = df['Cur'].map(lambda x:x.lstrip('@').rstrip('@'))
    df['date'] = df['date'].apply(lambda x:pd.timestamp(str(x)[:10]))
    df['Price'] = pd.to_numeric(df['Price'].replace(',',';'), errors='coerce')
    return df

from pathlib import Path

file_path = Path("your_files_path/")

df = pd.concat([clean_up(pd.read_csv(i)) for  i in file_path.iterdir()])

यदि आपके पथ/फ़ोल्डर में .csv के अलावा अन्य फ़ाइलें हैं, तो आप निम्न का उपयोग करके csv फ़ाइलों को फ़िल्टर कर सकते हैं:

df = pd.concat([pd.read_csv(i) for  i in file_path.glob('**/*.csv')])

.dat फ़ाइलें पढ़ने के लिए, मुझे लगता है कि आप यह कर सकते हैं:

df = pd.concat([pd.read_fwf(i) for  i in file_path.glob('**/*.dat')])

.dat फ़ाइलें (एक छोटा सा नमूना) पढ़ने के लिए, मुझे लगता है कि आप यह कर सकते हैं:

n = 5
df = pd.concat([pd.read_fwf(i) for  i in file_path.glob('**/*.dat')[:n])
2
YOLO 21 जिंदा 2020, 18:35
कृपया संपादन की जाँच करें, ऐसा लगता है कि मुझे वह हिस्सा याद आ गया है।
 – 
YOLO
19 जिंदा 2020, 19:12
आपके पास कितनी फाइलें हैं? संपादन की जाँच करें, हो सकता है कि फ़ाइल स्वरूप में कुछ गड़बड़ हो। पहले n फ़ाइलों को पढ़ने का प्रयास करें और देखें कि क्या यह ठीक रहता है
 – 
YOLO
21 जिंदा 2020, 18:35
मेरे पास 50 फाइलें हैं और प्रत्येक फाइल में 56 एमओ हैं...इतना बहुत बड़ा...कोड अभी भी चल रहा है जैसा कि हम बोलते हैं
 – 
KIKI99
21 जिंदा 2020, 22:37

एक सामान्यीकृत विधि स्थापित करने पर विचार करें जो एक सीएसवी पढ़ता है और आवश्यक डेटा सफाई करता है। फिर, संयोजन के लिए डेटा फ़्रेम की सूची बनाने के लिए फ़ाइलों की निर्देशिका के माध्यम से लूप करें। डिफ़ॉल्ट सहित read_csv के सभी आवश्यक तर्कों का उपयोग करना सुनिश्चित करें:

import os
import pandas as pd

def proc_df(csv_file)
  DB = pd.read_csv(csv_file, header = None, sep=";",
                   names = ["date", "Code", "Cur", "Price"], 
                   usecols = [0,4,5,6])

  DB['Code'] = DB['Code'].str.lstrip('@').str.rstrip('@')
  DB['Cur'] = DB['Cur'].str.lstrip('@').str.rstrip('@')
  DB['date'] = pd.timestamp(DB['date'].str([:10]))
  DB['Price'] = pd.to_numeric(DB['Price'].replace(',',';')

  return DB

path = "C:/directory/to/data"

df_list = [proc_df(os.path.join(path, f)) for f in os.listdir(path)]

final_df = pd.concat(df_list, ignore_index = True)
0
Parfait 21 जिंदा 2020, 20:34
यहाँ त्रुटि है जो मुझे मिली "श्रृंखला' वस्तु में कोई विशेषता नहीं है 'rstrip'"
 – 
KIKI99
21 जिंदा 2020, 19:01
मैं यहां जिस बड़ी समस्या का सामना कर रहा हूं वह है टाइमिंग और मेमोरी ... क्योंकि प्रत्येक फाइल में 55 एमओ होते हैं और मेरे पास 100 फाइलें होती हैं।
 – 
KIKI99
21 जिंदा 2020, 22:43
आपके लिए क्या धीमा है? 5 मिनट। या 50 मिनट।? कृपया read_csv के बाद फ़ंक्शन की प्रत्येक पंक्ति पर टिप्पणी करें, लेकिन सबसे धीमी लाइन की जांच करने के लिए return नहीं। 100 फ़ाइलें बहुत अधिक नहीं हैं। एमओ क्या है?
 – 
Parfait
21 जिंदा 2020, 23:15
आह क्षमा करें मेरा मतलब 50 मेगा ऑक्टेट कहना था..3 घंटे के बाद मैं सीएसवी फाइलों का प्रबंधन करता हूं
 – 
KIKI99
22 जिंदा 2020, 13:19