Python 取消展平数据帧中的行

Python 取消展平数据帧中的行,python,pandas,Python,Pandas,使用这样的数据帧: date user sales_blue sales_red 2019/06/01 A 30 50 2019/06/01 B 60 70 2019/06/02 A 25 35 2019/06/02 B 42 52

使用这样的数据帧:

date           user    sales_blue     sales_red
2019/06/01        A            30            50
2019/06/01        B            60            70
2019/06/02        A            25            35
2019/06/02        B            42            52
我正在努力做到以下几点:

date           user    color    sales
2019/06/01        A     blue       30
2019/06/01        A      red       50
2019/06/01        B     blue       60
2019/06/01        B      red       70
2019/06/02        A     blue       25
2019/06/02        A      red       35
2019/06/02        B     blue       42
2019/06/02        B      red       52
通过使用循环,这在某种“手动”方式下是相当可行的,但出于性能原因,我会寻找一种更有效的解决方案,它不涉及Python中的循环。

您可以使用。为了从颜色中删除前缀,可以使用
str
访问器对字符串进行切片。如果您需要指定的顺序,只需按照@anky的建议添加
.sort\u值('date')

out = df.melt(id_vars=['date', 'user'], var_name='color', value_name='sales')
out['color'] = out.color.str[6:]

你可以用。为了从颜色中删除前缀,可以使用
str
访问器对字符串进行切片。如果您需要指定的顺序,只需按照@anky的建议添加
.sort\u值('date')

out = df.melt(id_vars=['date', 'user'], var_name='color', value_name='sales')
out['color'] = out.color.str[6:]

当您想使用列的所有名称来标识行时,
melt
通常是您的目标。但是,如果要使用列名的较小部分(其中前缀为常量),则更为用户友好的通用版
melt
称为
wide\u to\u long

这不仅可以干净地处理前缀,还可以缩放以处理多个不同的前缀

pd.wide_to_long(
    df, stubnames='sales', i=['date', 'user'], j='color', suffix='\w+', sep='_'
).reset_index(-1)


要将此行为推广到熔化多个柱,请执行以下操作:

print(df)

         date user  sales_blue  sales_red  calls_blue  calls_red
0  2019/06/01    A          30         50           3          4
1  2019/06/01    B          60         70           1          2
2  2019/06/02    A          25         35           4          6
3  2019/06/02    B          42         52           5          7

当您想使用列的所有名称来标识行时,
melt
通常是您的目标。但是,如果要使用列名的较小部分(其中前缀为常量),则更为用户友好的通用版
melt
称为
wide\u to\u long

这不仅可以干净地处理前缀,还可以缩放以处理多个不同的前缀

pd.wide_to_long(
    df, stubnames='sales', i=['date', 'user'], j='color', suffix='\w+', sep='_'
).reset_index(-1)


要将此行为推广到熔化多个柱,请执行以下操作:

print(df)

         date user  sales_blue  sales_red  calls_blue  calls_red
0  2019/06/01    A          30         50           3          4
1  2019/06/01    B          60         70           1          2
2  2019/06/02    A          25         35           4          6
3  2019/06/02    B          42         52           5          7


这太神奇了,我不知道这个方法。为了完整性起见,如果要透视多个变量,该怎么办?例如,
['sales\u blue'、'sales\u red'、'calls\u blue'、'calls\u red']
应该变成带有蓝色/红色索引的
['sales'、'calls']
,不确定您的意思,但问题似乎与此完全不同。你为什么不问一个新问题?如果你这样做了,请在这里告诉我:)@jivansure:)哦,那些是专栏@jivan,我明白你的意思。好吧,你仍然可以使用
melt
,需要做一些额外的工作,那就是对颜色列进行切片以获得颜色。这太神奇了,我不知道这种方法。为了完整性起见,如果要透视多个变量,该怎么办?例如,
['sales\u blue'、'sales\u red'、'calls\u blue'、'calls\u red']
应该变成带有蓝色/红色索引的
['sales'、'calls']
,不确定您的意思,但问题似乎与此完全不同。你为什么不问一个新问题?如果你这样做了,请在这里告诉我:)@jivansure:)哦,那些是专栏@jivan,我明白你的意思。您仍然可以使用
melt
,需要做的额外工作是对颜色列进行切片以获得颜色
                color  sales  calls
date       user
2019/06/01 A     blue     30      3
           A      red     50      4
           B     blue     60      1
           B      red     70      2
2019/06/02 A     blue     25      4
           A      red     35      6
           B     blue     42      5
           B      red     52      7