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)
答案 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如果您想要以特定订单结束,您必须自己处理。