Strange difference in performance of Pandas, dataframe on small & large scale

Viewed 48

I have a dataframe read from a CSV file. I need to generate new data and add them to the end of old ones.

But it's strange that it shows a totally different result when compare small scale and large scale. I guess it may relate to view, copy() & Chained assignment.

I tried 2 options to use pd.copy() to avoid potential problems.

First option:

d_jlist = pd.read_csv('127case.csv', sep=',')   #got the data  shape: (46355,48) from CSV file
d_jlist2 = d_jlist.copy()                       #Use deep copy, in case of change the raw data


d_jlist3 = pd.DataFrame()


a = np.random.choice(range(5,46350),size = 1000*365)  #Select from row 5 to row 46350


for i in a:
    d_jlist3 = d_jlist3.append(d_jlist.iloc[i].copy() +np.random.uniform(-1,1) )



d_jlist3 = d_jlist3.replace(0,0.001,regex=True)
d_jlist3 = d_jlist3.round(3)  

d_jlist = d_jlist.append(d_jlist3) 
a = consumption.columns.values     #Something to do with header
a = a[5:53]   
d_jlist.to_csv('1127case_1.csv',header = a,index=False)

Second option:

d_jlist = pd.read_csv('127case.csv', sep=',')
d_jlist2 = d_jlist.copy()

d_jlist3 = pd.DataFrame() 
a = np.random.choice(range(5,46350),size = 1000*365)


for i in a:
    d_jlist3 = d_jlist3.append(d_jlist2.iloc[i] +np.random.uniform(-1,1) )

d_jlist3 = d_jlist3.replace(0,0.001,regex=True)
d_jlist3 = d_jlist3.round(3)  

d_jlist = d_jlist.append(d_jlist3) 
a = consumption.columns.values     #Something to do with header
a = a[5:53]   
d_jlist.to_csv('1117case_2.csv',header = a,index=False)

The problem is, if I use these code on a small scale, it works as expected. New rows add to the old ones, and nothing in old data changed. However, if I come to the scale above (1000*365), the old rows will get changed.

And the strange thing is: only the first two columns of each row will stay unchanged. The rest of the columns of each row will all get changed.

The results:

The left one is old dataframe, it has (46356,48) shape. Below are the new data generated.

The right one is result got from option 1 (both options got same result). From the third columns, the old data got changed.

If I try either of the options in smaller scale (3 rows), it will be fine. All the old data will be kept.

d_jlist = pd.read_csv('127case.csv', sep=',')
d_jlist = d_jlist.iloc[:10]         #Only select 10 rows from old ones

d_jlist2 = d_jlist.copy()

d_jlist3 = pd.DataFrame() 
a = np.random.choice(range(5,6),size = 3)  #Only select 3 rows randomly from old data


for i in a:
    d_jlist3 = d_jlist3.append(d_jlist2.iloc[i] +np.random.uniform(-1,1) )

d_jlist3 = d_jlist3.replace(0,0.001,regex=True)
d_jlist3 = d_jlist3.round(3)  

d_jlist = d_jlist.append(d_jlist3)  
a = consumption.columns.values     #Something to do with header
a = a[5:53]  
d_jlist.to_csv('1117case_2.csv',header = a,index=False)

How can I understand this? I spent lots of time try to find explanation for this but failed.

Are some rules changed in Pandas when the scale is larger (To 365K level)?

0 Answers
Related