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