艾依古 发表于 2020-6-27 09:09:24

要怎样设置才能出现Data列和Nino12列这样的形式呢?

(csv文件)如下图所示。
Year        January        February        March        April          May        June       July           August        September          October        November        December
1870          -1.5        -0.96             -0.65                -0.32          -0.64        -0.96-0.98   -1.02        -1.02                -1.53        -1.42                -1.25
1871-0.74        -0.56             -0.78                -0.59          -0.76        -0.25       -0.34    -0.3        -0.35                -0.15        -0.37                -1.04
1872-1.18        -1.25             -1.02                -0.7          -0.75        -0.6       -0.7          -0.83        -0.66                -0.87        -0.63             -0.83
……
【任务】用 pandas 库读取“nino12.long.anom.data.csv”文件,将所有时间抽取为单独
的列 Date(形式为 YYYY-MM-01),所有异常平均值抽取为一个单独的列
Nino12,将所有缺失值丢弃处理,并导出到新的 txt 文件
“nino12_dropnan.txt”,第一行为表头,列名分别为 Date 和 Nino12,且表
头和数据行中的不同字段信息都是用逗号分割,如下图所示
Data               Nino12
1870-01-01         -1.5
1870-02-01         -0.96
1870-03-01         -0.65
1870-04-01         -0.32
1870-05-01         -0.64
……

Twilight6 发表于 2020-6-27 09:41:15

本帖最后由 Twilight6 于 2020-6-27 09:51 编辑



这样可否?

import pandas as pd


dp = pd.read_csv('nino12.long.anom.data.csv')

with open('nino12_dropnan.txt','w') as f:
    f.write('Data,Nino12\n')
    for i in dp.iterrows():
      month = 1
      year = ''
      for each in i.iteritems():
            if each == 'Year':
                year += str(each)[:-2]
                continue
            f.write(year+'-{:02}-01,{}\n'.format(month,each))
            month += 1

艾依古 发表于 2020-6-27 10:42:59

Twilight6 发表于 2020-6-27 09:41
这样可否?

可以可以,太感谢了!还想问一下如果只读成下面的Data和Nino12但不写入txt文件需要怎么设置代码呢?

Twilight6 发表于 2020-6-27 10:47:35

艾依古 发表于 2020-6-27 10:42
可以可以,太感谢了!还想问一下如果只读成下面的Data和Nino12但不写入txt文件需要怎么设置代码呢?



改成 print 就好了

import pandas as pd

dp = pd.read_csv('nino12.long.anom.data.csv')
print('Data,Nino12')
for i in dp.iterrows():
    month = 1
    year = ''
    for each in i.iteritems():
      if each == 'Year':
            year += str(each)[:-2]
            continue
      print(year+'-{:02}-01,{}'.format(month,each))
      month += 1

艾依古 发表于 2020-6-27 14:48:40

Twilight6 发表于 2020-6-27 10:47
改成 print 就好了

太谢谢啦!只是目前没有学过iterrows(), iteritems()这两个函数,所以不太看得懂后面几行代码的意思,可以麻烦解释一下吗?

Twilight6 发表于 2020-6-27 15:12:14

艾依古 发表于 2020-6-27 14:48
太谢谢啦!只是目前没有学过iterrows(), iteritems()这两个函数,所以不太看得懂后面几行代码的意思,可以 ...


iterrows()生成个以数据的行迭代的迭代器

iteritems()生成个以字典数据项为迭代的迭代器,

艾依古 发表于 2020-6-27 17:03:40

Twilight6 发表于 2020-6-27 15:12
iterrows()生成个以数据的行迭代的迭代器

iteritems()生成个以字典数据项为迭代的迭代器,

好滴,非常感谢~

Twilight6 发表于 2020-6-27 17:06:15

艾依古 发表于 2020-6-27 17:03
好滴,非常感谢~

问题解决,记得设置下最佳哈

艾依古 发表于 2020-6-27 17:20:05

好滴!可以再麻烦帮我看一下刚刚求助的一道题目吗?

艾依古 发表于 2020-6-28 09:24:57

Twilight6 发表于 2020-6-27 09:41
这样可否?

可以麻烦解释一下这几行代码的意思吗?
year = ''
for each in i.iteritems():
if each == 'Year':
year += str(each)[:-2]
f.write(year+'-{:02}-01,{}\n'.format(month,each))

Twilight6 发表于 2020-6-28 09:28:00

艾依古 发表于 2020-6-28 09:24
可以麻烦解释一下这几行代码的意思吗?
year = ''
for each in i.iteritems():


year = ''
用来记录这次循环到的是几几年 每次外部 for 循环 year 都要重置

year += str(each)[:-2]用来把年份切下来,你可以在前面加个print 观察下就知道为什么要这样切

f.write(year+'-{:02}-01,{}\n'.format(month,each)) 这个就是写入文件了 红色部分是格式化 2 个宽度,如果宽度不够用 0 来补充



艾依古 发表于 2020-6-28 09:49:17

Twilight6 发表于 2020-6-28 09:28
year = ''
用来记录这次循环到的是几几年 每次外部 for 循环 year 都要重置



好滴,谢谢!那这个i、each、[:-2]是表示什么啊?为什么换行符\n前面还有个{}呢?

Twilight6 发表于 2020-6-28 09:52:21

艾依古 发表于 2020-6-28 09:49
好滴,谢谢!那这个i、each、[:-2]是表示什么啊?为什么换行符\n前面还有个{}呢?

你在循环前面试着打印下 i你会发现第一个参数是 index 的值,第二个才是这一行的内容

each 也是同理,你都拿去打印下就能明白为什么这样写

[:-2] 是字符串切片操作,相当于去掉结尾的两个字符

换行符是因为需要换行,否则数据全在一行,而前面的 {} 括号是 format 格式化的用法,对应后面的参数替换这个括号的

艾依古 发表于 2020-6-28 10:10:37

哦哦,那为什么不加[:-2]得到的结果后面1872.0-03-01,-1.02会有.0呢?csv文件里面Year列里面没有.0啊?

艾依古 发表于 2020-6-28 10:27:56

Twilight6 发表于 2020-6-28 09:52
你在循环前面试着打印下 i你会发现第一个参数是 index 的值,第二个才是这一行的内容

each 也是同理 ...


哦哦,那为什么不加[:-2]得到的结果后面1872.0-03-01,-1.02会有.0呢?csv文件里面Year列里面没有.0啊?

Twilight6 发表于 2020-6-28 10:28:46

艾依古 发表于 2020-6-28 10:27
哦哦,那为什么不加[:-2]得到的结果后面1872.0-03-01,-1.02会有.0呢?csv文件里面Year列里面没有.0啊?

[:-2] 是字符串切片操作,相当于去掉结尾的两个字符

这句话就是说明了呀...把 .0 去掉了

艾依古 发表于 2020-6-28 10:37:18

Twilight6 发表于 2020-6-28 10:28
这句话就是说明了呀...把 .0 去掉了

好滴,那我可以再问一下昨天另外一题中if num_times == 'LaNina Temp' and num_times >= 5: 这个num_times的意思,和sumIndex += num_times的意思吗?
页: [1]
查看完整版本: 要怎样设置才能出现Data列和Nino12列这样的形式呢?