2017-06-12 8 views
0

私はパンダには初めてです。だから私は、この仕事を終えるためにいくつかの方法があるかどうか疑問に思います。Pandasを使用して10フレームの平均データフレームをブロックする方法は?

私は、次の形式のようなデータフレームを持っている:

Data for DNA geometry parameters

これは、分子動力学からのDNAのシミュレーションデータです。

とデータ・セットはここにある:だからBPdata.csv

、ここで合計1000のフレームであり、私の目的は、それぞれ10のフレームの平均値を得ることです、だから、最後に、私はデータは以下のようになりたいですこの:ブロック1は、私は慎重に、各行のインデックスを割り当てることで、私はこれらのタスクを完了することができると思います、が1〜10フレームと2の平均値は、フレーム11〜20

を表し

Block Base1 Base2 Shear Stretch Stagger ..... 
1  1  66  XX XX  XX 
1  2  65  XX XX  XX 
... ...  ... ... ... ... 
1  33  34  XX XX  XX 

2  1  66  XX XX  XX 
2  2  65  XX XX  XX 
... ...  ... ... ... ... 
2  33  34  XX XX  XX 

3  1  66  XX XX  XX 
3  2  65  XX XX  XX 
... ...  ... ... ... ... 
3  33  34  XX XX  XX 


4  1  66  XX XX  XX 
4  2  65  XX XX  XX 
... ...  ... ... ... ... 
4  33  34  XX XX  XX 

私はこの仕事を終わらせる便利な方法があるのだろうかと思います。私はgroupbyの機能についていくつかのウェブページをチェックしましたが、それはブロック平均機能を得るためにこの10行ずつこのグループを持たないように思われるので、pandasにあります。

ありがとうございました!

===============================更新============= =====================

申し訳ありませんが私の目的の説明に明確ではない、私はタスクを行う方法を考え出した私の目的をよりよく説明するサンプル出力。二本鎖DNAについて

、我々はそれがAGCT有する二重らせん構造を知っているので、BASE1はDNAのための1つの塩基を意味し、BASE2は別の鎖の相補的な塩基を意味します。 2つの対応する塩基は、水素結合によって一緒に連結されている。

のような:

Base1 : AAAGGGCCCTTT 
     |||||||||||| 
Base2 : TTTCCCGGGAAA 

だからここBPdata.csvでBASE1及びBASE2の各組み合わせは、DNA塩基対を意味しています。

ここBPdata.csvにおいて、これは1,2,3,4 ... 1000と注目異なる時間枠でシミュレート33塩基対のDNAです。

そしてIはグループにそれぞれ10時間、一緒にフレームたいような1〜10,11〜20,21〜30 ...、及び各グループに、各塩基対の平均を行います。

# -*- coding: utf-8 -*- 

    import pandas as pd 

    ''' 

    Data Input 

    ''' 


    # Import CSV data to Python 


    BPdata = pd.read_csv("BPdata.csv", delim_whitespace = True, skip_blank_lines = False) 
    BPdata.rename(columns={'#Frame':'Frame'}, inplace=True) 

    ''' 

    Data Processing 

    ''' 
    # constant block average parameters 
    Interval20ns = 10 
    IntervalInBPdata = 34 


    # BPdataBlockAverageSummary 
    LEN_BPdata = len(BPdata) 

    # For Frame 1 
    i = 1 
    indexStarting = 0 
    indexEnding = 0 

    indexStarting = indexEnding 
    indexEnding = Interval20ns * IntervalInBPdata * i - 1 

    GPtemp = BPdata.loc[indexStarting : indexEnding] 
    GPtemp['Frame'] = str(i) 
    BPdata_blockOF1K_mean = GPtemp.groupby(['Frame','Base1','Base2']).mean() 
    BPdata_blockOF1K_mean.loc[len(BPdata_blockOF1K_mean)] = str(i) 
    # For Frame 2 and so on 
    i = i + 1 
    indexStarting = indexEnding + 1 
    indexEnding = Interval20ns * IntervalInBPdata * i - 1 
    while (indexEnding <= LEN_BPdata - 1): 
     GPtemp = BPdata.loc[indexStarting : indexEnding] 
     GPtemp['Frame'] = str(i) 
     meanTemp = GPtemp.groupby(['Frame','Base1','Base2']).mean() 
     meanTemp.loc[len(meanTemp)] = str(i)  
     BPdata_blockOF1K_mean = pd.concat([BPdata_blockOF1K_mean,meanTemp]) 
     i = i + 1 
     indexStarting = indexEnding + 1 
     indexEnding = Interval20ns * IntervalInBPdata * i - 1 

をし、結果は私が欲しかったものである。このようなものです::ここ

そして、私は考え出したデータである

Results

そして、ここでの出力例であるが、 BPdataresult.csv

これまでのところ、私はそこに警告を得ました:

SettingWithCopyWarning:値は、DataFrameの スライスのコピーに設定しようとしています。 GPtemp [ '枠'] = STR(I)/home/iphyer/Downloads/dataProcessing.py:62 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy :ドキュメントの注意事項を参照してください

代わりの.locを使用してみてください[row_indexer、col_indexer] = 値: SettingWithCopyWarning:DataFrameの スライスのコピーに値を設定しようとしています。 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy GPtemp [ '枠'] = STR(I)

そして、ここで私は疑問に思う:

代わり

は、ドキュメントの注意事項を参照してください[row_indexer、col_indexer] = 値を.LOC使用してみてください

  1. この警告は深刻ですか?
  2. Pandasgroupby機能のため、データフレームのインデックスは(Frame,Base1,Base2)の組み合わせになりました。どのように元の形式のように区切ることができますか。代わりに、#FrameBlockの添え字を追加してください。
  3. コードを改善するか、この作業を行うためにさらにパンダの方法を使用できますか?

ベスト!

+0

はあなたが行うことができ、あなたのデータフレームが 'df'と呼ばれていると仮定すると:' df.groupby(DFの[」 #Frame '] // 10).mean() 'を実行します。また、おそらく '#Frame'の列の名前を' Frame'に変更するべきです。 – Abdou

+0

@Abdou、Thx、私は説明を更新しました。今、新しい問題がいくつかあります。 – sikisis

答えて

2

パンダのグループ化はさまざまな方法で行うことができます。それらの方法の1つはシリーズを渡すことです。したがって、10行ブロックの値を持つ系列を渡すことができます。次のように解決策は動作します:

import pandas as pd 
import numpy as np 

#create datafram with 1000 rows 
df = pd.DataFrame(np.random.rand(1000, 1) 

#create series for grouping 
groups_of_ten = pd.Series(np.repeat(range(int(len(df)/10)), 10)) 

#group the data 
grouped = df.groupby(groups_of_ten) 

#aggregate 
grouped.agg('mean') 

グループ化シリーズが内側に次のようになります。

In [21]: groups_of_ten.head(20) 
Out[21]: 
0  0 
1  0 
2  0 
3  0 
4  0 
5  0 
6  0 
7  0 
8  0 
9  0 
10 1 
11 1 
12 1 
13 1 
14 1 
15 1 
16 1 
17 1 
18 1 
19 1 
+0

こんにちは、@ウーディープライド、私はあなたのソリューションを試しましたが、結果は次のようになります: '#Frame Base1 Base2シアストレッチスタガーバックル\ 0 485.803153 16.995941 50.004059 0.017325 -0.042114 0.067136 1.731197 '元の構造最初のフレームの – sikisis

+0

たとえば、Base1 Base2レコードの平均値だけでなく平均値も維持したいと考えています。 – sikisis

+0

私はあなたの問題を理解していません。小さな再現可能な例と予想される出力で質問を更新したい場合は、おそらく誰かがより完全な解決策を投稿します。 –