2016-08-22 9 views
-4

は、私は次のようなデータフレームがあります。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 [「国」]は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

メモリを節約する方法をお探しの場合は、[categoricals](http://pandas.pydata.org/pandas-docs/stable/categorical.html)を使用してください。そうしないと、何が改善するのかわかりません。 – ayhan

+0

あなたは何をvalue1、value2、value3と呼んでいますか? – jtitusj

+0

@ayhanこんにちは、私はちょうどvalue1、value2、value3の例を使用しました。実際には、200以上の異なるcolを持つ可能性があり、各colsには3〜5の異なる値しかありません。だから私は文字列を使って圧縮したい。 – Chauncey

答えて

1

OKランダムDATAFRAMEで始めてみましょう:あなたはcategoricalsを使用する場合はどうなります

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 
関連する問題