Python - 枢轴/分组 - pandas 长到宽

问题描述 投票:0回答:1

我有多个表,它们都具有相同的列。文档包含具有 3 个不同 ID

ID1
ID2
ID3
的项目。 ID 大多是不同的 accros 表,但也有一些重复,并且也存在并非所有 3 个 ID 都已知的情况。我组合了不同的表,现在我的数据如下所示(简单示例):

df_A = pd.DataFrame({'ID1': ['A', 'A', 'B', 'B', np.nan, np.nan],
                     'ID2': ['AB', 'AB', np.nan, np.nan, np.nan,np.nan],
                    'ID3': [np.nan,np.nan,np.nan,np.nan, 'EFG','HIJ'],
                   'Source': ['source_1', 'source_2', 'source_1', 'source_2', 'source_3', 'source_3'],
                   'Count': [1, 1, 1, 1, 1, 1]})

>>> df_A

   ID1  ID2  ID3    Source  Count
0    A   AB  NaN  source_1      1
1    A   AB  NaN  source_2      1
2    B  NaN  NaN  source_1      1
3    B  NaN  NaN  source_2      1
4  NaN  NaN  EFG  source_3      1
5  NaN  NaN  HIJ  source_3      1

我想要的是从长变宽,以

Source
为列,这样它看起来像这样:

   ID1  ID2  ID3  source_1  source_2  source_3
0    A   AB  NaN         1         1         0
1    B  NaN  NaN         1         1         0
2  NaN  NaN  EFG         0         0         1
3  NaN  NaN  HIJ         0         0         1

它一定是带有

pivot_table
的东西,也许还有
groupby
。我尝试过这样的事情:

df_A_pivot = pd.pivot_table(df_A, index=['ID1','ID2', 'ID3'],
                      columns='Source',
                      values='Count').reset_index()

但是我收到空行或错误,例如:

numpy.core._exceptions._ArrayMemoryError: Unable to allocate 225. ID1 for an array with shape (30262231164,) and data type object
python pandas numpy group-by pivot
1个回答
0
投票

您可能会在处理 NaN 值或可用于执行操作的内存方面遇到问题,这可能会导致 ArrayMemoryError。

为了避免 ArrayMemoryError,您可以尝试以下几种方法:

确保有足够的可用内存来处理 DataFrame 操作。这可能是一个问题,尤其是对于大型数据帧。 如果可能,请考虑将列的数据类型更改为内存效率更高的类型。 对于旋转 DataFrame,假设不会由于 DataFrame 的大小而发生内存错误,您可以使用pivot_table 以及 groupby 和 unstack 方法来重塑 DataFrame。这在代码中看起来像这样:

import pandas as pd
import numpy as np

# First, fill NaN values in ID1, ID2, and ID3 with a placeholder if necessary.
df_A['ID1'].fillna('', inplace=True)
df_A['ID2'].fillna('', inplace=True)
df_A['ID3'].fillna('', inplace=True)

# Now pivot the table
df_pivot = df_A.pivot_table(index=['ID1', 'ID2', 'ID3'], 
                            columns='Source', 
                            values='Count', 
                            aggfunc=np.sum, 
                            fill_value=0).reset_index()

# Optionally, merge the multi-level index of columns.
df_pivot.columns = [' '.join(col).strip() for col in df_pivot.columns.values]

这将按 ID 组合对每个源的计数进行求和,并将计数中的 NaN 替换为零。

© www.soinside.com 2019 - 2024. All rights reserved.