我有多个表,它们都具有相同的列。文档包含具有 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
您可能会在处理 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 替换为零。