【问题标题】:How to chop and reshape/melt a table or CSV file如何切割和重塑/融化表格或 CSV 文件
【发布时间】:2018-08-09 04:46:46
【问题描述】:

我有一个 CSV 文件,其中包含每个变量的 minmax 值,如下所示:

original = """
min_a max_a min_b max_b
3 5 1 9
"""

第一行按变量名排序,因此保证从min_amax_z。我想像这样重塑/融化它:

goal = """
 min max
a 3 5
b 1 9
"""

我该怎么做?我觉得这里可以使用pandas.melt 或 numpy 方法,但不知道如何使用。我目前的“hack”是按如下方式重塑第二行值,然后将结果复制粘贴或写入 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 

有没有合适的方法来做到这一点?谢谢!

【问题讨论】:

    标签: python string pandas csv numpy


    【解决方案1】:

    通过split创建MultiIndex,然后可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2013-01-11
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多