繁体   English   中英

部分反转熊猫数据帧

[英]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 numbernames_to是搭配中的第一项names_pattern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM