【问题标题】:Pivot data into a dataframe将数据透视到数据框中
【发布时间】:2019-12-31 07:33:23
【问题描述】:

我正在尝试使用数据帧的 pivot_table 函数来透视数据

我的原始数据框 df 的形状为 (630352,5),并且生成的旋转数据集应为 (395194,196784) 但是我收到的错误消息是这样的:

  File "D:\Anaconda\lib\site-packages\pandas\core\reshape\reshape.py", line 177, in _make_selectors
    mask.put(selector, True)

IndexError: index 458495173 is out of bounds for axis 0 with size 458444768

这是我用来透视数据的代码。

df_pivot= df.pivot_table(index=['saleorder'],columns='product', values='quantity',aggfunc=sum)

原来的df就是这种格式

saleorder | product | desc | id | quantity

12345     | bs1234  | abc  | 2  | 1
12345     | bs12214 | abc  | 2  | 1
12312     | bs12214 | abc  | 2  | 1

【问题讨论】:

  • 你能分享你的数据框样本吗?
  • @GrzegorzSkibinski 请查看原帖,添加示例格式
  • 不知道。也许您会将 df 分成两部分,并使用“pivot_table”分别测试它们。 df= df.sort_values('saleorder'), 查找作为新 'saleorder' 开始的索引,例如: 300000 。 df1=df.iloc[:300000], df2=df.iloc[300000:]
  • @kantal 这就是我目前所做的,但是一旦我旋转了每个块,我将如何将它们重新合并在一起。我不能只使用外部合并,因为它可能的产品 ID 将重复,在这种情况下,我希望它们作为合并数据框中的新行而不是重复列。
  • @Isra 连接它们!如果旋转的数据帧是 df1p 和 df2p:dfrslt= pd.concat([df1p,df2p],sort=False)

标签: python pandas memory pivot pivot-table


【解决方案1】:

正如我在评论中所写:

    # Test data:
    text="""saleorder | product | desc | id | quantity 

     10001     | prod01 | abc  | 2  | 1 
     12345     | prod02 | abc  | 2  | 2 
     12345     | prod03 | abc  | 2  | 3 
     12312     | prod04 | abc  | 2  | 4 
     12345     | prod03 | abc  | 2  | 3 
     88888     | prod05 | abc  | 2  | 5 
     99999     | prod03 | abc  | 2  | 3 
     99999     | prod05 | abc  | 2  | 5 
     12345     | prod03 | abc  | 2  | 3 
     """                                                                                                                  

df=pd.read_csv(io.StringIO(text),sep=r"[\s\|]+",engine="python").sort_values("saleorder")                            

   saleorder product desc  id  quantity
0      10001  prod01  abc   2         1
3      12312  prod04  abc   2         4
1      12345  prod02  abc   2         2
2      12345  prod03  abc   2         3
4      12345  prod03  abc   2         3
8      12345  prod03  abc   2         3
5      88888  prod05  abc   2         5
6      99999  prod03  abc   2         3
7      99999  prod05  abc   2         5

在位置 6(不是索引!)开始一个新的“销售订单”:

df1p= df.iloc[:6].pivot_table(index=['saleorder'],columns='product', values='quantity',aggfunc=sum)
df2p= df.iloc[6:].pivot_table(index=['saleorder'],columns='product', values='quantity',aggfunc=sum)

dfrslt= pd.concat([df1p,df2p],sort=False)                                                                                    

           prod01  prod02  prod03  prod04  prod05
saleorder                                        
10001         1.0     NaN     NaN     NaN     NaN
12312         NaN     NaN     NaN     4.0     NaN
12345         NaN     2.0     9.0     NaN     NaN
88888         NaN     NaN     NaN     NaN     5.0
99999         NaN     NaN     3.0     NaN     5.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多