内置支持将列名转换为值?

时间:2016-04-20 00:25:19

标签: pandas

pandas是否有任何内置支持用于从此

进行转换
   Foo  Bar  Baz  color  texture
0  845  758  421    red   creamy
1  259  512  405    red  crunchy
2  784  304  477  green   creamy
3  584  909  505  green  crunchy
4  282  756  619   blue   creamy
5  251  910  983   blue  crunchy

到这个

   brand  color  texture  votes
0    Foo    red   creamy    845
1    Foo    red  crunchy    259
2    Foo  green   creamy    784
3    Foo  green  crunchy    584
4    Foo   blue   creamy    282
5    Foo   blue  crunchy    251
6    Bar    red   creamy    758
7    Bar    red  crunchy    512
8    Bar  green   creamy    304
9    Bar  green  crunchy    909
10   Bar   blue   creamy    756
11   Bar   blue  crunchy    910
12   Baz    red   creamy    421
13   Baz    red  crunchy    405
14   Baz  green   creamy    477
15   Baz  green  crunchy    505
16   Baz   blue   creamy    619
17   Baz   blue  crunchy    983

单词:列标题的某些已转换为新列brand的值,并且最初位于这些列下的值已放入新列中votes

(当然,新列的名称'品牌'和'投票'不能从原始数据框推断出来;他们' d需要作为原始数据框之上的附加数据提供。此​​外,可以想象可以提供关于数据框列中新列位置的附加信息。)

注意:我无法帮助您从更简单的原语实现此转换。我在问 pandas 是否已经有一个能够做到这一点的功能,如果有的话,它是什么。

FWIW,这里有一些代码用于生成上面显示的起始数据帧:

import pandas
import itertools
import random

color = ['red', 'green', 'blue']
texture = ['creamy', 'crunchy']
brand = ['Foo', 'Bar', 'Baz']

random.seed(0)
records = [tuple(random.randint(1, 10000) for _ in brand) + p
           for p in itertools.product(color, texture)]
columns = brand + ['color', 'texture']
dataframe = pandas.DataFrame.from_records(records, columns=columns)

1 个答案:

答案 0 :(得分:3)

您正在寻找melt

>>> pandas.melt(dataframe, id_vars=["color", "texture"], var_name="brand", 
                           value_name="votes")
    color  texture brand  votes
0     red   creamy   Foo   6312
1     red  crunchy   Foo   4243
2   green   creamy   Foo   6635
3   green  crunchy   Foo   5867
4    blue   creamy   Foo   8269
5    blue  crunchy   Foo   2290
6     red   creamy   Bar   6891
7     red  crunchy   Bar   8377
8   green   creamy   Bar   4970
9   green  crunchy   Bar   9559
10   blue   creamy   Bar   2282
11   blue  crunchy   Bar   1554
12    red   creamy   Baz    664
13    red  crunchy   Baz   7962
14  green   creamy   Baz   7809
15  green  crunchy   Baz   3579
16   blue   creamy   Baz   4618
17   blue  crunchy   Baz   4105

AFAIK如果您想要以特定订单结束,您必须自己处理。