【问题标题】:How to solve the ValueError: Unstacked DataFrame is too big, causing int32 overflow in python?如何解决 ValueError: Unstacked DataFrame is too big,导致python中的int32溢出?
【发布时间】:2022-06-28 01:07:35
【问题描述】:

每个 ID 都有一个动态格式的数据框

df:

ID   |Start Date|End date |claim_no|claim_type|Admission_date|Discharge_date|Claim_amt|Approved_amt
10   |01-Apr-20 |31-Mar-21|  1123  |CSHLESS   |   23-Aug-2020 | 25-Aug-2020  |   25406 | 19351 
10   |01-Apr-20 |31-Mar-21|  1212  |POSTHOSP  |   30-Aug-2020 | 01-Sep-2020  |   4209  | 3964
10   |01-Apr-20 |31-Mar-21|  1680  |CSHLESS   |   18-Mar-2021 | 23-Mar-2021  |   18002 |  0
11   |12-Dec-20 |11-Dec-21|  1503  |CSHLESS   |   12-Jan-2021 | 15-Jan-2021  |   76137 | 50286
11   |12-Dec-20 |11-Dec-21|  1505  |CSHLESS   |   05-Jan-2021 | 07-Jan-2021  |   30000 | 0

基于 ID 列,我正在尝试将所有动态变量转换为静态格式,以便每个 ID 都有一行。 ID、开始日期、结束日期等列本质上是静态的,其余列本质上对于每个 ID 都是动态的。

为了达到以下输出:

ID   |Start Date|End date |claim_no_1|claim_type_1|Admission_date_1|Discharge_date_1|Claim_amt_1|Approved_amt_1|claim_no_2|claim_type_2|Admission_date_2|Discharge_date_2|Claim_amt_2|Approved_amt_2|claim_no_3|claim_type_3|Admission_date_3|Discharge_date_3|Claim_amt_3|Approved_amt_3
10   |01-Apr-20 |31-Mar-21|  1123    |CSHLESS    | 23-Aug-2020     | 25-Aug-2020    |   25406   | 19351        |  1212    |POSTHOSP    | 30-Aug-2020     | 01-Sep-2020    |   4209   | 3964         |    1680  |CSHLESS     | 18-Mar-2021     | 23-Mar-2021   |   18002   | 0

我正在使用以下代码:

# Index columns
idx = ['ID', 'Start Date', 'End date']

# Sequential counter to identify unique rows per index columns
cols = df.groupby(idx).cumcount() + 1

# Reshape using stack and unstack
df_out = df.set_index([*idx, cols]).stack().unstack([-2, -1])

# Flatten the multiindex columns
df_out.columns = df_out.columns.map('{0[1]}_{0[0]}'.format)

但是会抛出ValueError: Unstacked DataFrame is too big,导致int32溢出

【问题讨论】:

  • 你能下拉到int16吗?
  • 我已经完成了,但仍然抛出同样的错误。

标签: python-3.x pandas dataframe


【解决方案1】:

试试这个:

索引列(与您的代码非常相似)

idx = ['ID', 'Start Date', 'End date']

# Sequential counter to identify unique rows per index columns
df['nrow'] = df.groupby(idx)['claim_no'].transform('rank')
df['nrow'] = df['nrow'].astype(int).astype(str)

而不是堆栈和取消堆栈。使用这些功能,您可以更好地控制列

df1 = pd.melt(df, id_vars =['nrow', *idx] , value_vars=['claim_no', 'claim_type', 'Admission_date',
                                 'Discharge_date', 'Claim_amt', 'Approved_amt'],
                     value_name='var'
                     )

df2 = df1.pivot(index=[*idx],
                    columns=['variable', 'nrow'], values='var')

df2.columns = ['_'.join(col).rstrip('_') for col in df2.columns.values]

print(df2)


                        claim_no_1 claim_no_2 claim_no_3 claim_type_1 claim_type_2 claim_type_3 Admission_date_1 Admission_date_2 Admission_date_3 Discharge_date_1 Discharge_date_2 Discharge_date_3 Claim_amt_1 Claim_amt_2 Claim_amt_3 Approved_amt_1 Approved_amt_2 Approved_amt_3
ID Start Date End date                                                                                                                                                                                                                                                                
10 01-Apr-20  31-Mar-21       1123       1212       1680      CSHLESS     POSTHOSP      CSHLESS      23-Aug-2020      30-Aug-2020      18-Mar-2021      25-Aug-2020      01-Sep-2020      23-Mar-2021       25406        4209       18002          19351           3964              0
11 12-Dec-20  11-Dec-21       1503       1505        NaN      CSHLESS      CSHLESS          NaN      12-Jan-2021      05-Jan-2021              NaN      15-Jan-2021      07-Jan-2021              NaN       76137       30000         NaN          50286              0            NaN

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多