2016-10-07 16 views
1

自分のクラスを定義しているクラス構造から、pandas DataFrame領域に移行し、データで多くの操作を行うことを想定しています。この時点でPandas DataFrameの再構築

私はこのようになりますデータフレームを持っている:

ID Name Recording Direction Duration Distance Path Raw 
    0 129 Houston Woodlands X 12.3 8 HWX.txt 
    1 129 Houston Woodlands Y 12.3 8 HWY.txt 
    2 129 Houston Woodlands Z 12.3 8 HWZ.txt 
    3 129 Houston Downtown X 11.8 10 HDX.txt 
    4 129 Houston Downtown Y 11.8 10 HDY.txt 
    5 129 Houston Downtown Z 11.8 10 HDZ.txt 
    ... ... ... .. .. ... ... ... 
    2998 333 Chicago Downtown X 3.4 50 CDX.txt 
    2999 333 Chicago Downtown Y 3.4 50 CDY.txt 
    3000 333 Chicago Downtown Z 3.4 50 CDZ.txt 

これはしかし、一度OKですが、私はすべてのXYZファイルをロードした後、グループに希望/アレイ(列を追加)それに加えて、配列操作の製品(FFTなど)で新しい列を追加します。

ID Name Recording Duration Distance Rawx Rawy Raxz FFT-Rawx FFT-Rawy FFT-Raxz 
0 129 Houston Woodlands 12.3 8 HWX.txt HWY.txt HWZ.txt FFT-HWX.txt FFT-HWY.txt FFT-HWZ.txt 
1 129 Houston Downtown 11.8 10 HDX.txt HDY.txt HDZ.txt FFT-HDX.txt FFT-HDY.txt FFT-HDZ.txt 
... ... ... .. ... ... ... ... ... ... ... ... 
1000 333 Chicago Downtown 3.4 50 CDX.txt CDY.txt CDZ.txt FFT-CDX.txt FFT-CDY.txt FFT-CDZ.txt 

任意のアイデア方法を:

最後に、私は次のようになりDATAFRAMEをご希望ですか?

残念ながら、すべての細胞にこの素晴らしい構造があるわけではありません。

代わり

HDX HDY HDZの

私は、 "ランダムな名前" を持つことができます。しかし、私は彼らがこの順であることを知っています:

最初はZ、2番目はY、3番目は常にXです。各レコードには3つの信号があり、次のレコードが来ます。ループを既存のデータフレームに空の列を追加し、それを埋めるためのオプションがある場合

k =1 
for row in df: 
    if k % 3 == 0: 
    # Do something 
    elif k % 3 == 2: 
    # Do something 
    else: 
    # Do something 
    k += 1 

は、しかし、私にはわからない:

私はの線に沿って何かを考えていました。このようなオプションがある場合は、私に知らせてください。

答えて

1

pandas.pivot_tablesのリストを連結することを検討してください。ただし、連結する前に、データフレームはRaw value common stems-HW.txt,HD.txt,CDでスライスする必要があります。TXT - グループ化された使用して正規表現:

from io import StringIO 
import pandas as pd 
import re 

df = pd.read_csv(StringIO(''' 
ID,Name,Recording,Direction,Duration,Distance,Path,Raw 
0,129,Houston,Woodlands,X,12.3,8,HWX.txt 
1,129,Houston,Woodlands,Y,12.3,8,HWY.txt 
2,129,Houston,Woodlands,Z,12.3,8,HWZ.txt 
3,129,Houston,Downtown,X,11.8,10,HDX.txt 
4,129,Houston,Downtown,Y,11.8,10,HDY.txt 
5,129,Houston,Downtown,Z,11.8,10,HDZ.txt 
6,333,Chicago,Downtown,X,3.4,50,CDX.txt 
7,333,Chicago,Downtown,Y,3.4,50,CDY.txt 
8,333,Chicago,Downtown,Z,3.4,50,CDZ.txt''')) 

# UNIQUE 'RAW' STEM GROUPINGS 
grp = set([re.sub(r'X|Y|Z', '', i) for i in df['Raw'].tolist()]) 

dfList = [] 
for i in grp:  
    # FILTER FOR 'RAW' VALUES THAT CONTAIN STEMS 
    temp = df[df['Raw'].isin([i.replace('.txt', txt+'.txt') for txt in ['X','Y','Z']])]  
    # RUN PIVOT (LONG TO WIDE) 
    temp = temp.pivot_table(values='Raw', 
          index=['Name', 'Recording', 'Direction','Distance', 'Path'], 
          columns=['Duration'], aggfunc='min') 
    dfList.append(temp) 

# CONCATENATE (STACK) DFS IN LIST 
finaldf = pd.concat(dfList).reset_index() 

# RENAME AND CREATE FFT COLUMNS 
finaldf = finaldf.rename(columns={'X': 'Rawx', 'Y': 'Rawy', 'Z': 'Rawz'}) 
finaldf[['FFT-Rawx', 'FFT-Rawy', 'FFT-Rawz']] = 'FFT-' + finaldf[['Rawx', 'Rawy', 'Rawz']] 

出力

# Duration Name Recording Direction Distance Path  Rawx  Rawy  Rawz  FFT-Rawx  FFT-Rawy  FFT-Rawz 
# 0   129 Houston Downtown  11.8 10 HDX.txt HDY.txt HDZ.txt FFT-HDX.txt FFT-HDY.txt FFT-HDZ.txt 
# 1   129 Houston Woodlands  12.3  8 HWX.txt HWY.txt HWZ.txt FFT-HWX.txt FFT-HWY.txt FFT-HWZ.txt 
# 2   333 Chicago Downtown  3.4 50 CDX.txt CDY.txt CDZ.txt FFT-CDX.txt FFT-CDY.txt FFT-CDZ.txt 
1

私は部分的な答えがあると思います!私はFFT(高速フーリエ変換?)とデータがどこから来たのか、あなたが望むものについて少し混乱しました。

しかし、私は他のものを手に入れました。

まず、サンプルデータを作成します。

import pandas as pd 

df = pd.DataFrame({"ID": [0, 1, 2, 3, 4, 5], "Name":[129, 129, 129, 129, 129, 129], 
     "Recording":['Houston Woodlands', 'Houston Woodlands', 'Houston Woodlands', 
        'Houston Downtown', 'Houston Downtown', 'Houston Downtown'], 
     "Direction": ["X", "Y", "Z", "X", "Y", "Z"], "Duration":[12.3, 12.3, 12.3, 11.8, 11.8, 11.8], 
     "Path_Raw":["HWX.txt", "HWY.txt", "HWZ.txt", 'HDX.txt', 'HDY.txt', 'HDZ.txt'], 
     "Distance": [8, 8, 8, 10, 10, 10]}) 

ここでは、いくつかの新しい機能を定義します。私はこれらを分けたので、少しカスタマイズしやすくなります。基本的には、私は.uniqueを呼び出し、各Path Rawを新しい変数として保存しています。

def splitunique0(group): 
    ulist = group.unique() 
    return(ulist[0]) 


def splitunique1(group): 
    ulist = group.unique() 
    return(ulist[1]) 


def splitunique2(group): 
    ulist = group.unique() 
    return(ulist[2]) 


dothis = {"Duration":"first", "Distance":"first", 'Path_Raw': {'Rawx': splitunique0, 
                  'Rawy': splitunique1, 
                  'Raxz': splitunique2}} 

new = df.groupby(["Name", "Recording"]).agg(dothis) 

new.columns = ["Duration", "Distance", "Raxz", "Rawx", "Rawy"] 

ここで完成したデータフレームです! Duration Distance Raxz Rawx Rawy Name Recording
129 Houston Downtown 11.8 10 HDZ.txt HDX.txt HDY.txt Houston Woodlands 12.3 8 HWZ.txt HWX.txt HWY.txt