【问题标题】:Turn multiple columns into two new columns in a dataframe using Pandas使用 Pandas 将数据框中的多列转换为两个新列
【发布时间】:2020-08-14 18:47:51
【问题描述】:

我在 python pandas 环境中工作:D

目前,我有一个如下所示的数据框:

 0   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 ex10 ex11 ex12 ex13 ex14 ex15 ex16 ex17 ex18 

我的目标是让数据框看起来像这样:

 0   1   2   3   4   5  6    7   8   category   amount   
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     9        ex9
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     10       ex10
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     11       ex11
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     12       ex12
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     13       ex13
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     14       ex14
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     15       ex15
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     16       ex16
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     17       ex17
ex0 ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8     18       ex18

基本上,我希望最后 9 列标题和值在 2 个新列上成为它们自己的行,同时保持前 8 列和行相同。我知道这意味着数据将被复制。

我在 stackoverflow 上看到了一些其他答案,使用以下代码处理较小的数据帧,但它对我不起作用:

df.melt(['Type', 'Class'], var_name='Date', value_name='Value')

(df.set_index(['Type', 'Class'])
   .stack()
   .rename_axis(['Type', 'Class', 'Date'])
   .reset_index(name='Value')
)

感谢任何和所有帮助! 谢谢

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    melt你快到了

    df.melt(id_vars=df.columns[:9], var_name='category', value_name='amount')
    
    Out[469]:
         0    1    2    3    4    5    6    7    8 category amount
    0  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8        9    ex9
    1  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       10   ex10
    2  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       11   ex11
    3  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       12   ex12
    4  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       13   ex13
    5  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       14   ex14
    6  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       15   ex15
    7  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       16   ex16
    8  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       17   ex17
    9  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       18   ex18
    

    【讨论】:

    • 您好!我意识到我正在做的融化是正确的,但是我的列名是错误的,因此我误解了我的问题。我很尴尬?。不过感谢您的确认!
    • @V1cst3r:不客气。没有什么可尴尬的。所有程序员都遇到了同样的问题,包括我自己。干杯:)
    【解决方案2】:

    melt吧:

    print (df.melt([i for i in df.columns if int(i)<9], var_name="category", value_name="amount"))
    
         0    1    2    3    4    5    6    7    8 category amount
    0  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8        9    ex9
    1  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       10   ex10
    2  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       11   ex11
    3  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       12   ex12
    4  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       13   ex13
    5  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       14   ex14
    6  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       15   ex15
    7  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       16   ex16
    8  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       17   ex17
    9  ex0  ex1  ex2  ex3  ex4  ex5  ex6  ex7  ex8       18   ex18
    

    【讨论】:

    • 感谢您的回答!不过,我会接受安迪的回答,因为它在没有 for 循环的情况下完成了相同的任务。干杯!
    【解决方案3】:

    第一,我将第二个数据框(使用不同的名称)减去最后两列,以便尺寸正确。 在声明一个正确大小的空 df(减去最后两列)之后,您可以通过使用此命令循环执行此操作:

    dataFrame.set_value(index, col, value, takeable=False)
    

    或者您可以在前几列中使用您想要的数据创建列表,并创建一个字典来声明新的数据框,然后使用它。

    然后我会运行它来复制另外两列。

    cats=[cat for cat in df1.columns][-10:] 
    row1_section=df1.loc[0][-10:]
    df2['category'] = [cat for cat in cats]
    df2['amount']=[example for example in row1_section]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多