2016-10-07 22 views
1

필자는 자신의 클래스를 정의하는 클래스 구조에서 pandas DataFrame 영역으로 이동하여 데이터로 많은 작업을 수행 할 것을 제안했습니다. 이 시점에서Pandas DataFrame 재구성

나는이처럼 보이는 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 

이 그러나, 당시 괜찮습니다, 나는 모든 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 

어떤 생각이 어떻게 :

마지막으로 I는 다음과 같이 것 DataFrame를 원하십니까?

불행히도 모든 세포에이 멋진 구조가있는 것은 아닙니다.

대신

HDX HDY HDZ

나는 "임의의 이름을"할 수 있습니다. 그러나 나는 그들이 다음 순서에 있음을 알고 있습니다.

첫 번째는 Z이고 두 번째는 Y이고 세 번째는 항상 X입니다. 각 레코드에는 세 개의 신호가 있고 다음 레코드가옵니다. 루프를 통해 기존의 dataframe에 빈 열을 추가하고 그것을 채울 수있는 옵션이있는 경우

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 (fast fourier transform?)에 관해서 무엇을 원했고 데이터가 어디서 오는지에 대해 약간 혼란스러워했다.

그러나 나는 그 밖의 모든 것을 가지고 있습니다.

먼저 샘플 데이터를 만들어 보겠습니다.

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

관련 문제