如何在python pandas中处理字符串格式?

时间:2016-08-22 08:47:35

标签: python pandas

我有一个如下数据框:

    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

我的问题是如何编写代码来压缩此数据框并解压缩它。

1 个答案:

答案 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