iT邦幫忙

0

python處理csv檔問題

小弟目前只學習了基本的python語法,其他套件都還沒完全學會(有開始看pandas用法了)
雖然組長有簡單指導我方向(用for迴圈取值)然後用pandas來做更動,但實在還是不太有頭緒
希望可以請教各位大大我該怎麼做比較好QQ
https://ithelp.ithome.com.tw/upload/images/20210917/20136038M1EaziAdpQ.jpg
這是要處理的csv檔的長相,資料分為ID、年分、a~a7這幾項
每筆資料都是某機構在某年某季的資料,組長希望我重新將資料整理成為
https://ithelp.ithome.com.tw/upload/images/20210917/20136038mo6h2ATvA7.jpg
改成某機構在a的資料以時間排序 接著在做a2、a3、a4......
目前只想的到可以用isin去抓各個機構在每一季的所有資料然後再慢慢的把它改成組長要的規

https://ithelp.ithome.com.tw/upload/images/20210917/20136038Pqi22eS2MN.jpg
但資料其實不是只有短短的這幾筆,如果真的這樣做完大概要花上好幾天...
現在會取出a1和年份了 不知道這樣做正不正確
https://ithelp.ithome.com.tw/upload/images/20210917/20136038QnSP3Yi57e.jpg
希望大家能指點迷津QQ....

看更多先前的討論...收起先前的討論...
Homura iT邦高手 1 級 ‧ 2021-09-17 16:32:43 檢舉
試著思考先把201906和a1的資料先取出來
froce iT邦大師 1 級 ‧ 2021-09-17 16:34:53 檢舉
pandas group_by
不好意思 剛剛才發現我沒有把我目前做法上傳成功
目前是用isin來抓出資料 然後一個一個慢慢放
@Homura 我試著做出來了 ! 我有更新在文章上,再麻煩您了QQ
Homura iT邦高手 1 級 ‧ 2021-09-17 17:57:03 檢舉
froce大有提示@@
感覺我沒什麼慧根...現在正在翻書看group_by用法
obarisk iT邦研究生 2 級 ‧ 2021-09-18 11:53:33 檢舉
先罵組長(誤)

基本上, 把時間放成欄, 不是一個很好的習慣 (因為他會一直往右長)
大部份時間序列的資料也是 long format 居多.

也許有部份的人習慣把一個紀錄(by id)放成一個列. 但是在 tensor 的時代, 這個有點太老套了. Orz
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
Greysuki
iT邦新手 5 級 ‧ 2021-09-17 18:33:25

data = {
    "id": ["1", "2", "3", "4"],
    "year": ["201903", "201903", "201904", "201905"],
    "a1": [123, 456, 789, 165165],
    "a2": ["abc", "cde", "ttt", "7414"],
}

import pandas as pd

df = pd.DataFrame(data)
t = df.pivot("id", columns="year", values=["a1", "a2"])

a1 = t.loc[:, "a1"]
a1.loc[:,"type"] = "a1"

a2 = t.loc[:, "a2"]
a2.loc[:,"type"] = "a2"

pd.concat([a1,a2])

估計a1, a2....,a7 可以用stack之類的拉出來,
但我懶得想了所以你直接寫個fun撈吧
https://ithelp.ithome.com.tw/upload/images/20210917/20141586puQMUdLmxG.png

額外參考
Reshaping and pivot tables

1
miku3920
iT邦新手 2 級 ‧ 2021-09-18 00:27:54

幫你寫好了,自己研究看看這些方法是做啥的吧
df.pivot df.reset_index df.drop df.fillna df.rename df.append df.keys pd.Series pd.concat

import pandas as pd

df_before = pd.DataFrame({
    'num': ['1', '2', '3', '4', '5', '6', '7', '', '1', '2', '3', '4', '5', '6', '7'],
    'year': ['201903', '201903', '201903', '201903', '201903', '201903', '201903', '', '201906', '201906', '201906', '201906', '201906', '201906', '201906'],
    'a1': [1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, '', 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1],
    'a2': [1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, '', 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2],
    'a3': [1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3, '', 1.3, 2.3, 3.3, 4.3, 5.3, 6.3, 7.3],
})

print("-------------- before --------------")
print(df_before)
print()

# 修改 row 和 column
df_pivot = df_before.pivot(index='num', columns='year')

# 做點整理
df_list = [df_pivot[key].reset_index(drop=True).drop([0]).fillna(key).rename(columns={'year': ''}).reset_index().append(pd.Series(dtype='float'), ignore_index=True).fillna('') for key in df_before.drop(['num', 'year'], axis=1).keys()]

# 組合
df_after = pd.concat(df_list).reset_index(drop=True).rename(columns={'index': ''})

# 儲存
df_after.to_csv('Result.csv', index=False)

print("-------------- after --------------")
print(df_after)
print()

https://ithelp.ithome.com.tw/upload/images/20210918/20132916o4yPxDmOCT.png

0
coderrrr
iT邦新手 5 級 ‧ 2021-09-18 15:09:52

先用Python 把要填入的值都用print生成出來
然後再Pandas取出對的位置
這樣就可以把值填入到xlsx內

我要發表回答

立即登入回答