[英]Unpivot pandas DataFrame partly
我有下表 DataFrame
项目 | 描述 | 商店 1 数量 | 存储 1 个值 | 商店 2 数量 | 存储 2 值 |
---|---|---|---|---|---|
第 1 项 | 一些物品名称 | 5 | 120 | 7 | 240 |
第 2 项 | 一些其他项目 | 9 | 1234 | 12 | 98 |
在 Python 上有什么简单的方法可以只对商店进行逆透视吗? 要做到这一点:
项目 | 描述 | 店铺编号 | 价值 | 数量 |
---|---|---|---|---|
第 1 项 | 一些物品名称 | 店铺 1 | 5 | 120 |
我正在考虑将其完全取消旋转,然后将其旋转回来,保持价值和数量作为价值。 但我认为,应该有一些更有效的解决方案
如果需要Qty, Value
来分隔列, MultiIndex
第一列转换为MultiIndex
,因此可以使用Series.str.rsplit
由最后一个空格到MultiIndex in columns
,因此最后由DataFrame.stack
重塑:
df = df.set_index(['Items','Description'])
df.columns = df.columns.str.rsplit(n=1, expand=True)
df = df.rename_axis(('Store number',None), axis=1).stack(0).reset_index()
print (df)
Items Description Store number Qty Value
0 item 1 Some item name Store 1 5 120
1 item 1 Some item name Store 2 7 240
2 item 2 Some other item Store 1 9 1234
3 item 2 Some other item Store 2 12 98
您还可以将pd.melt()
与pd.pivot
一起使用,如下所示:
df_ = pd.melt(df, id_vars=['Items', 'Description'])
df_[['Store number', 'Type']] = df_['variable'].str.rsplit(n=1, expand=True)
df_ = df_.pivot(index=['Items', 'Description', 'Store number'], columns='Type', values='value').reset_index()
print(df_)
Type Items Description Store number Qty Value
0 item 1 Some item name Store 1 5 120
1 item 1 Some item name Store 2 7 240
2 item 2 Some other item Store 1 9 1234
3 item 2 Some other item Store 2 12 98
#pip install git+https://github.com/pyjanitor-devs/pyjanitor.git
import pandas as pd
import janitor
df.pivot_longer(index = ['Items', 'Description'],
names_to = ('Store Number', '.value'),
names_pattern = r"(.+\s\d)\s(.+)")
Items Description Store Number Qty Value
0 item 1 Some item name Store 1 5 120
1 item 2 Some other item Store 1 9 1234
2 item 1 Some item name Store 2 7 240
3 item 2 Some other item Store 2 12 98
本品采用pivot_longer从功能pyjanitor 。
说明:您要重塑的列有一个模式(商店编号后跟数量或价值); 我们在names_pattern
利用这一点,并使用组的正则表达式 ( r"(.+\\s\\d)\\s(.+)"
) - 第一个组指向Store 1/Store2
,而另一个组指向Qty/Value
。
names_to
参数指定新数据names_to
外观 - 对于这种特定情况, .value
告诉函数将与其关联的列的部分保留为标题 - 在这种情况下, .value
是第二个条目,所以它是与names_pattern
的第二组配对; store number
在names_to
是搭配中的第一项names_pattern
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.