Pandas 没有重复索引的多索引到 CSV
Pandas Multiindex to CSV without duplicate Index
我这辈子都不知道如何删除将多索引数据帧写入 CSV 时创建的重复索引项。虽然那里有这个 answer,但它本身并不适用于我,因为我的第二个级别具有所有不同的值。
这是我拥有的数据框的一部分,它每个月都会继续
Month Measure
JAN KWH
Max KW
Day/Hour
Peak End Use
Peak Pct
FEB KWH
Max KW
Day/Hour
Peak End Use
Peak Pct
但在 CSV 中它看起来像
JAN KWH
JAN Max KW
JAN Day/Hour
JAN Peak End Use
JAN Peak Pct
FEB KWH
FEB Max KW
FEB Day/Hour
FEB Peak End Use
FEB Peak Pct
我希望它看起来与数据框完全一样,这意味着在 CSV 中它看起来像
Jan,KWH
,Max KW
,Day/Hour
and so on
我试过 df.index.to_series().duplicates()
但它不起作用,因为我的每个索引对都不重复。我也尝试过使用 index.tolist()
然后循环进行更改但没有运气。
此处正确的方法是什么?
提前致谢!
好像pandas并没有直接提供这样的功能,可能是为了确保生成的csv文件可以回读,如上面的评论所述。在为第一种格式的报告生成 table 时,我遇到了同样的问题。最后,我决定通过外部脚本处理生成的 csv。 script 将列中的重复值替换为空格,从而达到预期的效果。注意:此脚本假定逗号作为 csv 分隔符。
# Clean csv with multiindices
from sys import argv
# Positional command line arguments:
# 1: original csv file
# 2: number of columns to check (optional)
with open(argv[1], 'r') as f:
if len(argv) > 2:
n = int(argv[2])
i0 = ('', ) * n
else:
n = None
i0 = None
for l in f:
if n is None:
# define n from the 1-st line
i1 = l.split(',')
n = len(i1)
i0 = ('', ) * n
i1 = l.split(',', n)
nl = ()
for s0, s1 in zip(i0, i1):
if s0 == s1:
e = ' ' * len(s0)
else:
e = s1
nl += (e, )
nl += tuple(i1[n:])
print ','.join(nl),
i0 = i1[:n]
我这辈子都不知道如何删除将多索引数据帧写入 CSV 时创建的重复索引项。虽然那里有这个 answer,但它本身并不适用于我,因为我的第二个级别具有所有不同的值。
这是我拥有的数据框的一部分,它每个月都会继续
Month Measure
JAN KWH
Max KW
Day/Hour
Peak End Use
Peak Pct
FEB KWH
Max KW
Day/Hour
Peak End Use
Peak Pct
但在 CSV 中它看起来像
JAN KWH
JAN Max KW
JAN Day/Hour
JAN Peak End Use
JAN Peak Pct
FEB KWH
FEB Max KW
FEB Day/Hour
FEB Peak End Use
FEB Peak Pct
我希望它看起来与数据框完全一样,这意味着在 CSV 中它看起来像
Jan,KWH
,Max KW
,Day/Hour
and so on
我试过 df.index.to_series().duplicates()
但它不起作用,因为我的每个索引对都不重复。我也尝试过使用 index.tolist()
然后循环进行更改但没有运气。
此处正确的方法是什么?
提前致谢!
好像pandas并没有直接提供这样的功能,可能是为了确保生成的csv文件可以回读,如上面的评论所述。在为第一种格式的报告生成 table 时,我遇到了同样的问题。最后,我决定通过外部脚本处理生成的 csv。 script 将列中的重复值替换为空格,从而达到预期的效果。注意:此脚本假定逗号作为 csv 分隔符。
# Clean csv with multiindices
from sys import argv
# Positional command line arguments:
# 1: original csv file
# 2: number of columns to check (optional)
with open(argv[1], 'r') as f:
if len(argv) > 2:
n = int(argv[2])
i0 = ('', ) * n
else:
n = None
i0 = None
for l in f:
if n is None:
# define n from the 1-st line
i1 = l.split(',')
n = len(i1)
i0 = ('', ) * n
i1 = l.split(',', n)
nl = ()
for s0, s1 in zip(i0, i1):
if s0 == s1:
e = ' ' * len(s0)
else:
e = s1
nl += (e, )
nl += tuple(i1[n:])
print ','.join(nl),
i0 = i1[:n]