如何读取国家数据的 csv,其中第一列是“州”,第二列是“城镇”,并按州求和列?(蟒蛇/熊猫)

How do I read a csv of national data, where first column is "state", second "town", and sum columns by state? (Python/Pandas)

提问人:AndysPythonStuff 提问时间:8/26/2022 最后编辑:AndysPythonStuff 更新时间:8/26/2022 访问量:85

问:

每天我都会创建一个看起来像这样的 csv。

扇形 法典 科尔1 科尔2 科尔3 科尔4
座位
代码A 数据 数据 数据 数据
编解码B 数据 数据 数据 数据
编 解码 器 数据 数据 数据 数据
编码 数据 数据 数据 数据
第2节
代码E 数据 数据 数据 数据
代码F 数据 数据 数据 数据
代码G 数据 数据 数据 数据
代号H 数据 数据 数据 数据
第3节
代码I 数据 数据 数据 数据
代码J 数据 数据 数据 数据
编解码器K 数据 数据 数据 数据
代码L 数据 数据 数据 数据
SectN(北区)
食品 数据 数据 数据 数据
代号Y 数据 数据 数据 数据
代码Z 数据 数据 数据 数据

请注意空白单元格:扇区名称后面的整行,以及每个代码之前的“扇区”列。

我想阅读 csv 并且:

  1. 按扇区对列求和,创建一个数据帧,该数据帧应如下所示:
0 1 2 3 4
扇区1 col1total col2total col3total col4total
扇区2 col1total col2total col3total col4total
部门3 col1total col2total col3total col4total
扇区N col1total col2total col3total col4total

  1. 将 csv 拆分为“扇区”数据帧,并单独处理每个数据帧。

我是个菜鸟,可能比我能咀嚼的还要多!目前,我将原始 csv 分离为扇区 csv 并使用以下代码以这种方式求和,但您可以想象它很耗时。它与我的问题无关,但这是我使用的代码:

导入熊猫

使用 open('D:\Libraries\Downloads\igcxtest.csv', 'r') 作为 fileObject: reader_object = pandas.read_csv(fileObject, delimiter=';', decimal=',', header=0, names=('Noticia','Ativo','Variacao','Maximo', 'Ultimo','Minimo','Negocios','Semana', 'Mes','3 mes','6 mes','12 mes', '体积','百分之四','百分之八', '十二%','加25M','加25Q', 'plus50m','plus50q','负fourpercent', '负十八','负十二', '负25米','负25Q','负50米','负50米', '周高','两周高','三周高', '三月高','年高','周低', '两周低点','三周低点','三周低点', 'Yearlow','Over200','Over50','Over21','Grafico')) # 打印(reader_object) reader_object.drop(['Noticia', 'Maximo', 'Ultimo','Minimo','Negocios','Semana','Mes','3 mes','6 mes','12 mes','Grafico'], axis=1, inplace=True) #print(reader_object) print(reader_object['Threemthhigh'])

reader_object['up_or_down'] = reader_object['Variacao'].apply(lambda x: 1 if x > 0 else (-1 if x < 0 else 0))
#Calculate ups and downs
ups = 0
downs = 0
up_down = []
for val in reader_object['Variacao']:
    if val >0:
        ups+=1
    elif val < 0:
        downs+=1
up_down = [ups, downs]
print(up_down)

#Calculate cumulative volume
reader_object['Volume'] = reader_object['Volume'] * reader_object['up_or_down']
#print(reader_object)
vol = 0
for v in reader_object['Volume']:
    vol += v

reader_object.drop(['Variacao', 'up_or_down'], axis=1, inplace=True)
print(reader_object)
#print(ups, downs, vol)

#Sum columns
sums = reader_object.sum(numeric_only=True)
print(sums)
sums_list = []
x=0
for x in sums:
    sums_list.append(x)
sums_list = up_down + sums_list
print(sums_list)
sum_df = pandas.DataFrame(sums_list).T
#print(sum_df)
sum_df.to_csv('D:\Libraries\Downloads\sums.csv')

我找不到有关阅读原始 csv 的方法的信息,并首先使用(我想)行中的关键字(“sectorN”)或行数(每个“扇区”中有多少个“代码”)来拆分它。

有什么建议吗?谢谢。。。

python pandas csv 拆分

评论

1赞 Barmar 8/26/2022
呸。这是一种可怕的文件格式。他们应该只把状态放在每一行,而不是作为章节标题。

答:

3赞 Chase 8/26/2022 #1

你可以试试这个:

  1. 将 csv 读入数据帧
  2. 正向填充“状态”列df['State'].fillna(method = 'ffill', inplace = True)
  3. 筛选出 Town 为 null 的行df2 = df.query('Town is not null')
  4. 按州和城镇聚合/分组,并对每个度量列求和df3 = df2.groupby(['State', 'Town']).sum().reset_index()

评论

0赞 AndysPythonStuff 8/26/2022
好的,谢谢。试试看。我以为空的单元格可能会使事情复杂化。