我有一个如下数据框:
pop state country num_1 num_2
0 1.8 Ohio China 1 4
1 1.9 Ohio China 1 5
2 3.9 Nevada Britain 1 6
3 2.9 Nevada Germany 1 2
4 2.0 Nevada Japan 1 7
您可以在此数据框中看到,df [' country']有4个不同的值。我可以使用00 =中国,01 =英国,10 =德国,11 =日本来表示其价值。而df [' num_1'],df [' num_2']有1,5个不同的值。我也可以将其值表示为二进制数。
所以我想将这个数据框压缩成一个小数据框,如下所示:
pop state value
0 1.8 Ohio 000000
1 1.9 Ohio 000001
2 3.9 Nevada 010010
3 2.9 Nevada 100011
4 2.0 Nevada 110100
我的问题是如何编写代码来压缩此数据框并解压缩它。
答案 0 :(得分:1)
好的,让我们从一个随机的DataFrame开始:
np.random.seed(0)
df = pd.DataFrame({'A': np.random.choice(list('ABC'), 10**7),
'B': 1,
'C': np.random.choice(list('xyztq'), 10**7)})
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000000 entries, 0 to 9999999
Data columns (total 3 columns):
A object
B int64
C object
dtypes: int64(1), object(2)
memory usage: 228.9+ MB
如果您使用分类,会发生什么:
for col in df:
df[col] = df[col].astype('category')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000000 entries, 0 to 9999999
Data columns (total 3 columns):
A category
B category
C category
dtypes: category(3)
memory usage: 28.6 MB
使用二进制表示:
df['A'] = df['A'].cat.codes.apply(lambda x: np.binary_repr(x, 2))
df['B'] = df['B'].cat.codes.apply(lambda x: np.binary_repr(x))
df['C'] = df['C'].cat.codes.apply(lambda x: np.binary_repr(x, 3))
df.head()
Out:
A B C
0 00 0 010
1 01 0 001
2 00 0 100
3 01 0 001
4 01 0 001
内存使用情况:
ser = df.apply(''.join, axis=1)
ser.to_frame().info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000000 entries, 0 to 9999999
Data columns (total 1 columns):
0 object
dtypes: object(1)
memory usage: 76.3+ MB