2017-09-05 2 views
0

私がしようとしているのはcsvで読み込まれ、特定の列に基づいて値が重複しないようにしてからデータは15のインクリメントよりも近くにポイントがありません。パンダのフィルタリング/データ削減(1)が良い方法です2)何が間違っているのですか?

私のコードはファイルを細かく読み取ってから、drop_duplicatesは必要に応じて動作し、その列でソートします。データを減らすために、私は既存のものから最初の行を使って新しいデータフレームを作成しています。次に、問題の列のすべての値を調べて、新しいデータフレームに追加します。少なくとも15 kg/hrであった。

私のデータフレームが正しく組み合わせるされていないと私はこのように配置された結果のデータフレームで終わるよ:

Unnamed: 0                  0 
TimeStamp (s)                0.002 
TC 01 (C)                30.6689 
TC 02 (C)                28.6879 
TC 03 (C)                27.9779 
TC 32 (C)                22.6416 
Product Back Pressure (kPa)            0.166353 
Product Mass Flow (kg/hr)            107.427 
Semtech Flow (kg/hr)              28.2135 
Mass Flow (kg/hr)              28.2135 
Voltage (V)                1.63065 
Angle (degrees)                0 
1         Unnamed: 0 TimeStamp (s) TC 01 (C) TC 02... 
2         Unnamed: 0 TimeStamp (s) TC 01 (C) TC 0... 
3         Unnamed: 0 TimeStamp (s) TC 01 (C) TC 02... 
4         Unnamed: 0 TimeStamp (s) TC 01 (C) TC 02... 

私は明らかに間違って何かをやっているが、少なくともそれはときよりも少ない間違っています私は "if"文の中に追加しようとしました。

def import_df(): 
    new_df = pd.read_csv(os.path.join(pathname, f), delimiter = ',') 
    new_df = new_df.drop_duplicates(subset = 'Mass Flow (kg/hr)') 
    new_df = new_df.sort_values('Mass Flow (kg/hr)') 
    reduced_df = new_df.iloc[0] 
    current_mass_flow = new_df['Mass Flow (kg/hr)'].iloc[0] 
    i = 1 
    for value in new_df['Mass Flow (kg/hr)']: 
     if value < current_mass_flow + 15: 
      reduced_df.loc[i] = new_df.loc[new_df['Mass Flow (kg/hr)'] == value] 
      current_mass_flow = value 
      i += 1 
     else: next 

    return reduced_df 

これを修正するにはどうすればよいですか?明らかに、データフレームに期待通りのものを追加していません。私は間違いなく、このデータフレームに行を追加する方法についていくつかの細かい点を欠いています。

また、私がやろうとしていることを達成するために、もっと簡単で直接的な方法があると感じることはできません。

Sample Source Data 

    TimeStamp (s) TC 01 (C) TC 02 (C) TC 03 (C) TC 32 (C) Product Back Pressure (kPa) Product Mass Flow (kg/hr) Semtech Flow (kg/hr) Mass Flow (kg/hr) Voltage (V) Angle (degrees) 
0 0.004 493.2881108 296.1245877 255.8202916 26.3430426 0.297276487 147.4692621 30.21243527 30.21243527 1.634457337 0 
1 0.178 493.2881108 296.1245877 255.8202916 26.3430426 0.283227103 147.4692621 30.21243527 30.21243527 1.634457337 0 
2 1.178 493.1325481 296.155699 255.8514043 26.3430426 0.283227103 144.5363918 31.06903075 31.06903075 1.634457337 0 
3 2.178 493.0703231 296.2490329 255.8825171 26.3430426 0.289335716 141.244467 31.06903075 31.06903075 1.634457337 0 
4 3.178 492.4480726 296.373478 255.8825171 26.40525146 0.292389668 141.244467 29.73651711 29.73651711 1.634139868 0 
5 4.178 493.2881108 296.373478 255.9136299 26.3430426 0.292389668 146.0926428 30.40291693 30.40291693 1.634457337 0 
6 5.178 493.2881108 296.4357006 255.8825171 26.40525146 0.289742626 146.0926428 30.40291693 30.40291693 1.634457337 0 
7 6.178 492.8836479 296.4045893 255.9136299 26.40525146 0.281191135 146.0926428 30.78359426 30.78359426 1.634139868 0 
8 7.178 493.1325481 296.373478 255.9447427 26.40525146 0.281191135 146.2123624 30.02223961 30.02223961 1.634457337 0 
90 959.629 442.3250036 300.5424521 264.6564452 27.77387677 0.593127726 203.9719224 44.39531112 44.39531112 1.635409746 0 
91 960.629 442.231666 300.5424521 264.6564452 27.77387677 0.599643603 203.9719224 44.77598845 44.77598845 1.634457337 0 
92 961.629 441.3605153 300.3557844 264.6564452 27.77387677 0.58966651 199.4828012 44.77598845 44.77598845 1.634457337 0 
93 962.629 441.0493901 300.3557844 264.6253324 27.77387677 0.58966651 199.1237467 43.63367047 43.63367047 1.634774807 0 
94 963.629 441.0493901 300.1691166 264.531994 27.77387677 0.58885198 199.1237467 43.63367047 43.63367047 1.635092276 0 
95 964.629 441.2360652 300.3868956 264.531994 27.77387677 0.588444716 203.8522028 43.63367047 43.63367047 1.635092276 0 
96 965.629 441.4849654 300.3557844 264.4697685 27.77387677 0.588444716 199.1237467 43.63367047 43.63367047 1.634139868 0 
97 966.629 441.3916279 300.2935618 264.4697685 27.77387677 0.597403826 199.1237467 44.39531112 44.39531112 1.633823352 0 
98 967.629 441.7338656 300.4802295 264.531994 27.77387677 0.592720461 203.8522028 44.39531112 44.39531112 1.634139868 0 
99 968.629 441.2982903 300.6046747 264.6253324 27.77387677 0.592720461 203.9719224 43.63367047 43.63367047 1.634139868 0 
100 969.629 441.578303 300.6980086 264.687558 27.77387677 0.606769845 203.9719224 45.06142494 45.06142494 1.634139868 0 
101 970.629 441.8894282 300.5735634 264.687558 27.77387677 0.594145709 200.3806463 45.06142494 45.06142494 1.635092276 0 

所望の出力

TimeStamp (s) TC 01 (C) TC 02 (C) TC 03 (C) TC 32 (C) Product Back Pressure (kPa) Product Mass Flow (kg/hr) Semtech Flow (kg/hr) Mass Flow (kg/hr) Voltage (V) Angle (degrees) 
13 12.178 493.008098 296.2490329 255.8825171 26.3430426 0.31682341 146.0327308 29.26059896 29.26059896 1.634139868 0 
77 947.156 443.7872922 301.3202954 264.9986859 27.74277234 0.613081913 199.8419601 44.39531112 44.39531112 1.637947595 0.158889819 
+0

サンプルソースデータと期待される出力を追加できます – Shijo

+0

サンプルデータを追加 – mauve

+0

私はPhikに同意します。その列の最大値と最小値の差はわずか15です。データ行を削除すると、かなりの情報が失われる可能性があります。 –

答えて

1

でこのコードをチェックして、あなたはこのを探しているなら、私に知らせてください。 pandas.DataFrame.iterrowsは、レコードをループして質量流量を確認するために使用されます。

pandas.DataFrame.iterrows ---フレームの行を反復処理するジェネレータ。

import pandas as pd 
import os 
new_df = pd.read_csv(os.path.join('C:\Shijo\Python\sample.txt'), delimiter = ',') 
new_df = new_df.drop_duplicates(subset = 'Mass Flow (kg/hr)') 
new_df = new_df.sort_values('Mass Flow (kg/hr)') 
new_df = new_df.reset_index(drop=True) 
current_mass_flow = new_df.iloc[0]['Mass Flow (kg/hr)'] 

indexlst=[1] 

for index, row in new_df.iterrows(): 

    if row['Mass Flow (kg/hr)'] > current_mass_flow + 15: 
     print ("Mathcing index : ",index) 
     indexlst.append(index) 
     current_mass_flow =row['Mass Flow (kg/hr)'] 


reduced_df= new_df.iloc[indexlst] 
print (reduced_df) 

重複除去から出力

TimeStamp (s) TC 01 (C) TC 02 (C) TC 03 (C) TC 32 (C) Product Back Pressure (kPa) Product Mass Flow (kg/hr) Semtech Flow (kg/hr) Mass Flow (kg/hr) Voltage (V) Angle (degrees) 
1   7.178 493.132548 296.373478 255.944743 26.405251      0.281191     146.212362    30.022240   30.022240  1.634457     0 
8  960.629 442.231666 300.542452 264.656445 27.773877      0.599644     203.971922    44.775988   44.775988  1.634457     0 
+0

これはまさに私が必要とすることです、ありがとう! – mauve

1

あなたが(例えばnp.arangeで)ビンを指定しますpandas.cut、探しているように思えます。例えば、this questionを参照してください。


EDIT: groupbycut

new_df.groupby(pd.cut(new_df['Mass Flow (kg/hr)'],\ 
        np.arange(new_df['Mass Flow (kg/hr)'].min(), 
          new_df['Mass Flow (kg/hr)'].max()+1, 
          15)))\ 
.apply(lambda x: x.loc[x['Mass Flow (kg/hr)'].idxmin()]) 
+0

私はそれが私が持っているデータの量をどのように減らすのか分かりません。私は文字通り、それらの2つのポイントにデータのチャンクをカットしたい - 実際のデータセットは約2000行であり、私はそれのほんの一部が必要です。私は、ループが何をしているのかを修正して、データフレームのフォーマットが完全に乱されたり、ループを全く使用しないようにする必要があります。 – mauve

0

アパートは、「再現性」のビンにデータを分割することは興味深いことではないでしょうか?

df['bins'] = df['Mass Flow (kg/hr)'] // 15      # Create bins from 0 
df.groupby(['bins'], as_index=False).mean().drop('bins', axis=1) # Get mean values 
                    # and remove "bin" column 

そうでない場合は、シリーズの最小値に対して正規化して同じプロセスを適用できます。このコードは(pandas.read_clipboard()で使用できない)直接データでテストされますが、「類似」のデータフレーム上で動作していること

df['bins'] = (df['Mass Flow (kg/hr)'] - df['Mass Flow (kg/hr)'].min()) // 15 # Normalized bins 
df.groupby(['bins'], as_index=False).mean().drop('bins', axis=1) 

注意。

関連する問題