2017-06-05 8 views
2

元のデータフレームに基づくいくつかの基準に基づいて新しいデータフレームを作成しようとしています。Python DataFrame Copy

df = pandas.io.sql.read_sql(sql, conn) 

Count_Row = df.shape[0] 
for j in range(Count_Row - 1): 

    if df.iloc[j, 0] == df.iloc[j + 1, 0]: 
     print(df.iloc[j, 2] + df.iloc[j + 1, 2], df.iloc[j, 4], df.iloc[j, 6], df.iloc[j, 3]) 

ただし、印刷する代わりに、そのデータを新しいデータフレームに追加します。

これはどのように可能ですか?

答えて

1

代わりのデータをプリントアウトします。これは、あなたに必要な出力

とデータフレームを与える新しいデータフレームに

import pandas as pd 

df = pandas.io.sql.read_sql(sql, conn) 
Count_Row = df.shape[0] 

results = pd.DataFrame() # create data frame to store results 

for j in range(Count_Row - 1): 
    if df.iloc[j, 0] == df.iloc[j + 1, 0]: 
     # create row of values to append 
     row = pd.Series([df.iloc[j, 2] + df.iloc[j + 1, 2], 
         df.iloc[j, 4], 
         df.iloc[j, 6], 
         df.iloc[j, 3]]) 
     results = results.append([row]) 

results.columns = ['v1', 'v2', 'v3', 'v4'] # the variables 

それを追加することができます

1

これを行うには、遅い "for"ループを使用しないでください。代わりに、これらの要素を選択し、必要な要素のために真であるマスクを生成します。

matches = df.iloc[:-1,0] == df.iloc[1:,0] 
new_df = df.iloc[:-1][matches] 

は、これはあなたが前に持っていたアプローチよりも10~100倍速くなります。

最後にnew_dfには、選択した行のコピーが含まれます。

[:-1]は、「最後の要素の前のすべての要素」を意味します。