2016-08-16 2 views
2

나는 unbalanced csv 파일에서 pandas 데이터 프레임을 만들려고합니다가장 빠른 방법으로 Pandas 데이터 프레임에 불균형 행을 어떻게 추가 할 수 있습니까?

그러나 내가 무차별 방식으로 만들면 속도가 너무 느립니다. 여기

, 나는 Dataframe

의 스키마를 만들 수 있습니다 열 목록과 파일의 행 무리가있다.

어떻게 빨리 처리 할 수 ​​있습니까?

(나는 다른 방법으로 빈 목록을 작성해야합니까?)

import pandas as pd 
import numpy as np 

for key in column_name: 

    newdf = pd.DataFrame(columns = column_name[key]) 
    with open(str(key) +'.csv') as f: 
     reader1 = csv.reader(f) 
     index = 0 

     print key, sum(1 for row in csv.reader(open(str(key) +'.csv'))) 

     for row in reader1: 

      if index % 10000 == 0: 
       print index 

      new_row = [np.nan]*len(column_name[key])    
      for i in range(len(row)): 
       new_row[i] = row[i] 

      newdf.loc[index] = new_row 
      index = index+1 

    newdf.to_csv(key+"_with_column_name"+".csv") 

답변

2

pd.DataFrame이 너덜 너덜 행의 목록에서 DataFrame을 구축 할 수 있습니다 : 또한

In [17]: pd.DataFrame([['a','b'],[1,2,3]]) 
Out[17]: 
    0 1 2 
0 a b NaN 
1 1 2 3.0 

,을 구축하는 빠른 DataFrame을 pd.DataFrame 번으로 호출하면 newdf.loc[index] = new_row을 여러 번 호출하는 것보다 훨씬 효율적입니다. 당신의 목적은 열 이름을 가진 새로운 CSV를 생성하는 경우, 단순히 에 열 이름을 쓰고 빨리 될 것이라고


import numpy as np 
import pandas as pd 

# column_name = {'foo':['A','B']} 
for key in column_name: 
    with open('{}.csv'.format(key), 'r') as f: 
     reader1 = csv.reader(f) 
     data = list(reader1) 
     nrows = len(data) 
     print('{}, {}'.format(key, nrows)) 
     newdf = pd.DataFrame(data, columns=column_name[key]) 
    # do stuff with newdf (1) 
    newdf.to_csv('{}_with_column_name.csv'.format(key)) 

(1) 주 새 파일을 만든 다음 이전 CSV의 내용을 새 CSV로 복사합니다. 이 경우에는 DataFrame을 구축 할 필요가 없으므로 성능이 저하됩니다.

for key in column_name: 
    newname = '{}_with_column_name.csv'.format(key) 
    with open('{}.csv'.format(key), 'r'), open(newname, 'w') as f, g: 
     g.write(','.join(column_name[key])+'\n') # assuming no quotation necessary 
     g.write(f.read()) 
관련 문제