Pandas的groupby方法

3

我有一个长达41年的数据集,希望使用Pandas模块进行一些统计计算。然而,我对Pandas的知识欠缺。以下是一个CSV文件数据集的示例:

date    day month   year    pcp1    pcp2    pcp3    pcp4    pcp5    pcp6
1.01.1979   1   1   1979    0.431   2.167   9.375   0.431   2.167   9.375
2.01.1979   2   1   1979    1.216   2.583   9.162   1.216   2.583   9.162
3.01.1979   3   1   1979    4.041   9.373   23.169  4.041   9.373   23.169
4.01.1979   4   1   1979    1.799   3.866   8.286   1.799   3.866   8.286
5.01.1979   5   1   1979    0.003   0.051   0.342   0.003   0.051   0.342
6.01.1979   6   1   1979    2.345   3.777   7.483   2.345   3.777   7.483
7.01.1979   7   1   1979    0.017   0.031   0.173   0.017   0.031   0.173
8.01.1979   8   1   1979    5.061   5.189   43.313  5.061   5.189   43.313

这是我的代码:

import numpy as np
import pandas as pd
import csv

filename="output813b.csv"
cols = ["date","year","month","day" ,"pcp1","pcp2","pcp3","pcp4","pcp5","pcp6"]
data1=pd.read_csv(filename,sep=',', header=None,names=cols,usecols=range(1,9))
colmns_needed=["month" ,"pcp1","pcp2","pcp3","pcp4","pcp5","pcp6"]
data2=pd.read_csv(filename,sep=',', header=None,names=colmns_needed)
mm=data2.groupby("month")
print(mm.sum())
print('\n')

但是 PCP 列下的值似乎存储为字符串。以下是 pcp1 的示例输出:

Month  pcp1 

1      0.4310.4720000.91800000.01011.63904.65900.5780...   
10     00.1500000000.027000.02400.1630.9610000000.017...   
11     00.4940000000000.0480.003012.26200000003.612.9...   
12     0.1890.0760.47000000000.08800.1080.26107.15000...   
13     00.06500.1060.00700000050.6207.1510.0860.1487....   
14     0000.64200000000.017025.5910.93400.04500000000...   
15     0.742000.0720000000000.32500000000002.9877.512...   
16     6.43900000000000.38103.986000000000033.5534.76...   
17     0.0890000.2750000.555001.9230.562.9130.1360000...   
18     3.28200000000.024000.656002.1750000000008.2434...   
19     1.28200000000000000.0070000000007.0383.0450.17...   
2      1.2160.1050000000010.4690.2092.9700.0415.6062....   
20     00.4960.05100000000000.3550.1582.8530.04600000...   
21     00000000000002.69903.5190.13000002.830.5151.09...   
22     0000000007.19600000000000001.4421.76500.04500....   
23     0000000008.168000.02100000000000.1083.8760.968...  

我该如何解决这个问题?

所有的数据类型=对象 - ömer sarı
1
你能试着将它们转换成数字吗?data2.loc[:, 'pcp1':'pcp6'] = data2.loc[:, 'pcp1':'pcp6'].astype('float') - ayhan
我遇到了这个错误:"return arr.astype(dtype) ValueError: 无法将字符串转换为浮点数:'pcp6'",我尝试从所需列中提取pcp6,但仍然遇到相同的错误。 - ömer sarı
这意味着'pcp6'出现在列本身,而不是标题中。你能分享一下CSV文件吗? - ayhan
1
你可以遵循 sparc_spread 的建议。你的文件已经有了一个标题列。data2 = pd.read_csv(filename) 就足够了(不需要再传递列名)。 - ayhan
显示剩余4条评论
1个回答

2
请不要在您的read_csv调用中指定header=None。这会告诉函数数据中没有标题行,而根据您上面发布的示例数据,文件的第一行是标题。因此,它将第一个标题行视为数据,从而混合像pcp10.431这样的值,并导致所有列被解释为字符串。

1
这实际上是真的。我以为如果有一个标题行,它会出现在总和中(或连接的字符串中),但显然不是这样。 - ayhan
1
你是对的,我把“header=None”改成了“header=10”,问题解决了。感谢Ayhan和Sparc_spread的所有努力和帮助。 - ömer sarı
1
@ömersarı 如果你传递 header=10,它会将第10行作为标题读取(跳过前9行)。你可以删除这部分;不需要指定头参数(默认情况下它会推断头)。 - ayhan
@ömersarı 很高兴能帮助您。 - sparc_spread

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接