鱼C论坛

 找回密码
 立即注册
查看: 1942|回复: 11

[已解决]求助各位老师,按照年份进行行列转置?

[复制链接]
发表于 2022-5-19 21:55:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 caeser 于 2022-5-19 21:56 编辑

求助各位老师,我怎么把原始数据格式按照年份进行行列转置?
最佳答案
2022-5-20 09:37:21
import pandas as pd
file=r'D:\temp\测试数据样本.csv'
newdf = pd.DataFrame()
with open(file,'r') as f:
    df = pd.read_csv(f,encoding='gb2312')
    dfid = df['date'].drop_duplicates().reset_index(drop=True)
    for i in dfid:
        newdf[i]=df["price"].where(df["date"]==i).dropna(how='any').reset_index(drop=True)

原始数据格式

原始数据格式

我想要的数据格式

我想要的数据格式

测试数据.zip

293 Bytes, 下载次数: 7

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-19 22:19:57 | 显示全部楼层


你发出来的数据就是转置后的...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 07:03:12 From FishC Mobile | 显示全部楼层
恐怕还得自己写vba代码
现成的转置都不符合你的要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 09:01:29 | 显示全部楼层
一、简单的方法用excel数据透视表。1.在B列插入一列序号“num”,B2输入公式“=COUNTIF($A$2:A2,A2)”向下填充。2.依次选择“插入”、“数据透视表”、“确定”。3.数据透视表字段对应选择,列“date”,行“num”,值“price”,OVER.
二、用pandas思路,A列去重当列索引,依次提取拼接。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 09:37:21 | 显示全部楼层    本楼为最佳答案   
import pandas as pd
file=r'D:\temp\测试数据样本.csv'
newdf = pd.DataFrame()
with open(file,'r') as f:
    df = pd.read_csv(f,encoding='gb2312')
    dfid = df['date'].drop_duplicates().reset_index(drop=True)
    for i in dfid:
        newdf[i]=df["price"].where(df["date"]==i).dropna(how='any').reset_index(drop=True)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 09:59:22 | 显示全部楼层
import csv
from itertools import zip_longest

def readcsv(filepath):
    data = {}
    with open(filepath,'r') as f:
        reader = csv.reader(f)
        for row in reader:
                if row[0] not in data:
                    data[row[0]] = []
                data[row[0]].append(row[-1])
    return data

def writecsv(filepath, data):
    with open(filepath, 'w', newline='') as f:
        writer = csv.DictWriter(f, data.keys())
        writer.writeheader()
        write_datas = []
        for each in zip_longest(*data.values(), fillvalue=''):
            write_datas.append(dict(zip(data.keys(), each)))
        writer.writerows(write_datas)
            
if __name__ == '__main__':
    result = readcsv('./test.csv')
    writecsv('./result.csv', result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 13:46:25 | 显示全部楼层
Twilight6 发表于 2022-5-19 22:19
你发出来的数据就是转置后的...

不好意思,疏忽了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 13:47:09 | 显示全部楼层
elven08 发表于 2022-5-20 09:01
一、简单的方法用excel数据透视表。1.在B列插入一列序号“num”,B2输入公式“=COUNTIF($A$2:A2,A2)”向下 ...

谢谢,excel,我能搞定的。但pandas不会。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 13:48:26 | 显示全部楼层

非常感谢大神老师,可惜最佳答案只能设置一个,抱歉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-21 11:52:50 | 显示全部楼层

老师,能不能麻烦一个事,您写的代码我还是看得不是太懂,可以写个注释吗?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-22 08:01:53 | 显示全部楼层
caeser 发表于 2022-5-21 11:52
老师,能不能麻烦一个事,您写的代码我还是看得不是太懂,可以写个注释吗?谢谢

import pandas as pd                     #导入pandas,简写pd
file=r'D:\temp\测试数据样本.csv'   #赋值路径
newdf = pd.DataFrame()              #新建空数据
with open(file,'r') as f:                  #打开文件,简写f
    df = pd.read_csv(f,encoding='gb2312')      #读取文件f的数据赋值给df
    dfid = df['date'].drop_duplicates().reset_index(drop=True)      #date列数据去重,重置索引,得到需要转置数据的列索("2015年","2016年",……)引赋值给dfid
    for i in dfid:        #遍历目标(列索引)"2015年","2016年",……
        newdf[i]=df["price"].where(df["date"]==i).dropna(how='any').reset_index(drop=True)
                            #逐个读取date在列索引名“2015年"的数据“price”,删除空值,重置索引,例:newdf[”2015年“]=[4.162,4.079,……]
#最后输出成你要的格式就行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-22 14:37:21 | 显示全部楼层
elven08 发表于 2022-5-22 08:01
import pandas as pd                     #导入pandas,简写pd
file=r'D:\temp\测试数据样本.csv'   # ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表