第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Python 將一系列重復的數據行轉換為多條記錄的列?

如何使用 Python 將一系列重復的數據行轉換為多條記錄的列?

湖上湖 2023-02-15 15:55:55
我們有來自測量多個部件的設備的數據,并將每個部件的多個測量結果輸出到一個 CSV 文件中。我們將 CSV 文件讀入具有如下結構的數據幀:PartNo  12Meas1   45Meas2   23!ENDPartNo  13Meas1   63Meas2   73!ENDPartNo  12Meas1   82Meas2   84!END“!END”標志表示一個部分的數據在哪里結束,下一個部分從哪里開始。我們想重塑數據,使其看起來像:PartNo  Meas1   Meas212      45      2313      63      7312      82      84(請注意,一個部分可能出現不止一次 - 因此沒有字段保證在所有記錄中都是唯一的。)樞軸產生:0   !END  Meas1  Meas2  PartNo0    NaN    NaN    NaN    12.01    NaN   45.0    NaN     NaN2    NaN    NaN   23.0     NaN3    NaN    NaN    NaN     NaN4    NaN    NaN    NaN    13.05    NaN   63.0    NaN     NaN6    NaN    NaN   73.0     NaN7    NaN    NaN    NaN     NaN8    NaN    NaN    NaN    12.09    NaN   82.0    NaN     NaN10   NaN    NaN   84.0     NaN11   NaN    NaN    NaN     NaN我如何壓縮這些行以按 PartNo 分組?轉置產生:       0      1      2     3       4      5      6     7       8      9      10    110  PartNo  Meas1  Meas2  !END  PartNo  Meas1  Meas2  !END  PartNo  Meas1  Meas2  !END1      12     45     23   NaN      13     63     73   NaN      12     82     84   NaN我怎樣才能每第 4 個項目重置該行?我可以在原始數據框中創(chuàng)建一個新的索引列,然后遍歷行,使用 !END 為每一行遞增索引(然后使用索引對數據進行分組),但似乎應該有一個更優(yōu)雅的方法變形函數來處理這種情況,或者可能有一個 Pivot 或 Transpose 的參數可以處理這種情況。我是 Python 初學者。這是完整的代碼:import pandas as pdfrom io import StringIOtdata = ('PartNo,    12\n''Meas1, 45\n''Meas2, 23\n''!END\n''PartNo,    13\n''Meas1, 63\n''Meas2, 73\n''!END\n''PartNo,    12\n''Meas1, 82\n''Meas2, 84\n''!END\n')tdf = pd.read_csv(StringIO(tdata), header=None)print(tdf)print(tdf.pivot(index=None, columns=0, values=1))print(tdf.T)
查看完整描述

4 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

#having dataframe x:

>>> x = pd.DataFrame([['PartNo',12],['Meas1',45],['Meas2',23],['!END',''],['PartNo',13],['Meas1',63],['Meas2',73],['!END',''],['PartNo',12],['Meas1',82],['Meas2',84],['!END','']])

>>> x

         0   1

0   PartNo  12

1    Meas1  45

2    Meas2  23

3     !END    

4   PartNo  13

5    Meas1  63

6    Meas2  73

7     !END    

8   PartNo  12

9    Meas1  82

10   Meas2  84

11    !END    


#grouping by first column, and aggregating values to list. First column then contains Series that you want. By converting each list in this series to series, dataframe is created, then you just need to transpose

>>> df = x.groupby(0).agg(lambda x: list(x))[1].apply(lambda x: pd.Series(x)).transpose()

>>> df[['PartNo','Meas1','Meas2']]

0 PartNo Meas1 Meas2

0     12    45    23

1     13    63    73

2     12    82    84


查看完整回答
反對 回復 2023-02-15
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

這是我會怎么做。我會將文件解析為任何文本文件,然后根據我需要的字段創(chuàng)建記錄。我會使用 '!END' 行作為行創(chuàng)建完成的指示器,將其寫入列表,然后最終將列表轉換為 DataFrame


import pandas as pd


filename='PartDetail.csv'

with open(filename,'r') as file:

    LinesFromFile=file.readlines()

    

RowToWrite=[]

for EachLine in LinesFromFile:

    ValuePosition=EachLine.find(" ")+1

    CurrentAttrib=EachLine[0:ValuePosition-1]

    if CurrentAttrib=='PartNo':

        PartNo=EachLine[ValuePosition+1:len(EachLine)-1].strip()

    if CurrentAttrib=='Meas1':

        Meas1=EachLine[ValuePosition+1:len(EachLine)-1].strip()

    if CurrentAttrib=='Meas2':

        Meas2=EachLine[ValuePosition+1:len(EachLine)-1].strip()

    if EachLine[0:4]=='!END':

        RowToWrite.append([PartNo,Meas1,Meas2])

        

PartsDataDF=pd.DataFrame(RowToWrite,columns=['PartNo','Meas1','Meas2']) #Converting to DataFrame

這將為您提供一個更清晰的 DataFrame,如下所示:-

http://img1.sycdn.imooc.com//63ec902f000141fb05670358.jpg

查看完整回答
反對 回復 2023-02-15
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

該文件不是 csv 文件,因此使用 csv 模塊解析它無法產生正確的輸出。它不是眾所周知的格式,所以我會使用自定義解析器:


with open(filename) as fd:

    data  = []

    row = None

    for line in fd:

        line = line.strip()

        if line == '!END':

            row = None

        else:

            k,v = line.split(None, 1)

            if row is None:

                row = {k : v}

                data.append(row)

            else:

                row[k] = v


header = set(i for row in data for i in row.keys())

df = pd.DataFrame(data, columns=header)


查看完整回答
反對 回復 2023-02-15
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

根據提供的信息,我認為你應該能夠使用這種方法實現你想要的:


df = df[df[0] != '!END']

out = df.groupby(0).agg(list).T.apply(lambda x: x.explode(), axis=0)

輸出:


0 Meas1 Meas2 PartNo

1    45    23     12

1    63    73     13

1    82    84     12

這基本上按 PartNo、Meas1 和 Meas2 鍵對原始 df 進行分組,并為每個列表創(chuàng)建一個列表。然后將每個列表分解為一個 pd.Series,從而為每個列表創(chuàng)建一個列,行數等于條目數每個鍵(都應該相同)


查看完整回答
反對 回復 2023-02-15
  • 4 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號