私はパンダには初めてです。だから私は、この仕事を終えるためにいくつかの方法があるかどうか疑問に思います。Pandasを使用して10フレームの平均データフレームをブロックする方法は?
私は、次の形式のようなデータフレームを持っている:
これは、分子動力学からの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
をし、結果は私が欲しかったものである。このようなものです::ここ
そして、私は考え出したデータである
そして、ここでの出力例であるが、 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使用してみてください
- この警告は深刻ですか?
Pandas
のgroupby
機能のため、データフレームのインデックスは(Frame,Base1,Base2)
の組み合わせになりました。どのように元の形式のように区切ることができますか。代わりに、#Frame
〜Block
の添え字を追加してください。- コードを改善するか、この作業を行うためにさらにパンダの方法を使用できますか?
ベスト!
はあなたが行うことができ、あなたのデータフレームが 'df'と呼ばれていると仮定すると:' df.groupby(DFの[」 #Frame '] // 10).mean() 'を実行します。また、おそらく '#Frame'の列の名前を' Frame'に変更するべきです。 – Abdou
@Abdou、Thx、私は説明を更新しました。今、新しい問題がいくつかあります。 – sikisis