提问人:AndysPythonStuff 提问时间:8/26/2022 最后编辑:AndysPythonStuff 更新时间:8/26/2022 访问量:85
如何读取国家数据的 csv,其中第一列是“州”,第二列是“城镇”,并按州求和列?(蟒蛇/熊猫)
How do I read a csv of national data, where first column is "state", second "town", and sum columns by state? (Python/Pandas)
问:
每天我都会创建一个看起来像这样的 csv。
扇形 | 法典 | 科尔1 | 科尔2 | 科尔3 | 科尔4 |
---|---|---|---|---|---|
座位 | |||||
代码A | 数据 | 数据 | 数据 | 数据 | |
编解码B | 数据 | 数据 | 数据 | 数据 | |
编 解码 器 | 数据 | 数据 | 数据 | 数据 | |
编码 | 数据 | 数据 | 数据 | 数据 | |
第2节 | |||||
代码E | 数据 | 数据 | 数据 | 数据 | |
代码F | 数据 | 数据 | 数据 | 数据 | |
代码G | 数据 | 数据 | 数据 | 数据 | |
代号H | 数据 | 数据 | 数据 | 数据 | |
第3节 | |||||
代码I | 数据 | 数据 | 数据 | 数据 | |
代码J | 数据 | 数据 | 数据 | 数据 | |
编解码器K | 数据 | 数据 | 数据 | 数据 | |
代码L | 数据 | 数据 | 数据 | 数据 | |
SectN(北区) | |||||
食品 | 数据 | 数据 | 数据 | 数据 | |
代号Y | 数据 | 数据 | 数据 | 数据 | |
代码Z | 数据 | 数据 | 数据 | 数据 |
请注意空白单元格:扇区名称后面的整行,以及每个代码之前的“扇区”列。
我想阅读 csv 并且:
- 按扇区对列求和,创建一个数据帧,该数据帧应如下所示:
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 |
或
- 将 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”)或行数(每个“扇区”中有多少个“代码”)来拆分它。
有什么建议吗?谢谢。。。
答:
你可以试试这个:
- 将 csv 读入数据帧
- 正向填充“状态”列
df['State'].fillna(method = 'ffill', inplace = True)
- 筛选出 Town 为 null 的行
df2 = df.query('Town is not null')
- 按州和城镇聚合/分组,并对每个度量列求和
df3 = df2.groupby(['State', 'Town']).sum().reset_index()
评论