我有一个CSV文件,其中包含每个变量的min
和max
值,如下所示:
original = """
min_a max_a min_b max_b
3 5 1 9
"""
第一行按变量名排序,因此保证它从min_a
到max_z
。我想像块一样重塑/融化它:
goal = """
min max
a 3 5
b 1 9
"""
我怎样才能做到这一点?我觉得pandas.melt或numpy方法可以在这里使用,但无法弄清楚如何。我目前的“黑客”是重塑第二行值,如下所示,并将结果复制粘贴或写入CSV:
orig = "3 5 1 9"
temp = orig.split()
chopped = [" ".join(temp[i:i+2]+["\n"]) for i in range(0,3,2)]
# chopped: ['3', '5', '1', '9']
ready = [" min max \n"] + [" ".join(e) for e in zip(['a','b'],chopped)]
# ready: [' min max \n', 'a 3 5 \n', 'b 1 9 \n']
flipped = "".join(ready)
# flipped: ' min max \na 3 5 \nb 1 9 \n'
print(flipped)
# Result:
# min max
# a 3 5
# b 1 9
有没有正确的方法呢?谢谢!
通过MultiIndex
创建split
然后可以使用stack
:
df.columns = df.columns.str.split('_', expand=True)
df = df.stack().reset_index(level=0, drop=True)
print (df)
max min
a 5 3
b 9 1
建立:
original = """
min_a max_a min_b max_b
3 5 1 9
"""
df = pd.read_csv(pd.compat.StringIO(original), sep="\s+")
print (df)
min_a max_a min_b max_b
0 3 5 1 9
1 4 6 2 10