2017-10-05 13 views
0

私はPython辞書に2つのデータフレームのコレクションを持っています。各データフレームには、0と1の組み合わせからなる文字列があります。さらに、文字列の長さは、長さがその月の日数に応じて変化します。Python:整数のデータフレーム列を1桁の列に分割する

私の問題は、私は、各列に1つまたはゼロまたは欠損値があるように、多くの中に文字列を分割する方法を見つけ出す傾けることです。

私は、list(map(int(i) for i in str(01111001))を使用して1つの数字を数字に分割できるという提案を見ました。

しかし、特定のレコードが短い場合は、各列が1つまたはゼロまたは欠損値が含まれているように、私は多くの列の中に、以下の辞書にCOLの休日を分割することができますか。

'ATM': 
    Plant   Year Month Holiday 
    01    1996 Mar '01111001' 
    02    1997 Feb '0111011' 
    SP    1996 Mar '01100111' 
    BE    1999 Mar '00111111' 

'FDA': 
Plant   Year  Month Holiday 
    01    2001 Mar '01111101' 
    02    2002 Mar '11110110' 
    SP    2001 Apr '1110011' 
    BE    2002 June '10111100' 

次のように私が達成したい結果がなります

'ATM': 
    Plant   Year Month H1 H2 H3 H4 H5 H6 H7 H8 
    01    1996 Mar 0 1 1 1 1 0 0 1 
    02    1997 Feb 0 1 1 1 0 1 1 NA 
    SP    1996 Mar 0 1 1 0 0 1 1 1 
    BE    1999 Mar 0 0 1 1 1 1 1 1 

'FDA': 
Plant   Year  Month H1 H2 H3 H4 H5 H6 H7 H8 
    01    2001 Mar 0 1 1 1 1 1 0 1 
    02    2002 Mar 1 1 1 1 0 1 1 0 
    SP    2001 Apr 1 1 1 0 0 1 1 NA 
    BE    2002 June 1 0 1 1 1 1 0 0 
+0

申し訳ありませんが、私のためにあなたが求めているものは明らかではありません。特にあなたが持っているものと達成したいもの。あなたは少し、あなたのコードの一部で多分拡張することができますか? –

+0

私は、各列が "1"または "0"要素を1つしか持たないように、列Holidayを多くの列に分割したいと考えています。 –

+0

'01111001'は無効な構文です。あなたは '0b01111001'を持っていますか?そして、これはちょうど別のベースで印刷された整数です。あるいは、すでに文字列である '' 01111001 ''がありますか? –

答えて

1

私はあなたが望むものをプリントアウトし、ほとんどのテストコードを作成しました。考え方はnumpystrの行列を使用して値を格納することです。行列は "NA"でいっぱいです。したがって、最後にそこにあります。このトリックは、希望する場所の値をコピーするためにブロードキャストを使用します。不要な列の連結と削除により、全体のデータフレームが完成します。このコードは、辞書のキーを繰り返し処理します。私はあなたがpandasデータフレームを使用していると仮定しており、ロードされたバイナリ値はobjectと解釈されます。

コードの最初の部分は、データフレームの辞書を構築するヘッダです。

import pandas as pd 
import numpy as np 

## Lets call it "header" 

from io import StringIO 

df_0 = """ 
Plant;Year;Month;Holiday 
01;1996;Mar;01111001 
02;1997;Feb;0111011 
SP;1996;Mar;01100111 
BE;1999;Mar;00111111 
""" 

df_1 = """ 
Plant;Year;Month;Holiday 
01;2001;Mar;01111101 
02;2002;Mar;11110110 
SP;2001;Apr;1110011 
BE;2002;June;10111100 
""" 

df_0 = pd.read_csv(StringIO(df_0), sep=";", dtype=object); 
df_1 = pd.read_csv(StringIO(df_1), sep=";", dtype=object); 

df = { "ATM": df_0, "PDE": df_1 } 

## "Header" end 

MAX_SIZE = 8 

for k in df: 
    ldf = df[k] 
    rows = ldf.shape[1] 

    # Here I create a matrix that will contain my required values "NA" 
    nmat = np.full((rows, MAX_SIZE), "NA") 

    for i in range(rows): 
     # I'm using the same conversion that I suggested you in 
     # the comments 
     ary = np.array([v for v in ldf["Holiday"][i]]) 
     # Copying only the needed part, in some cases the final 
     # array is of len 7 instead of 8. 
     nmat[i, 0:len(ary)] = ary 

    # Creating a new dataframe that will be 
    # concatenated by using the numpy array generated before. 
    nframe = pd.DataFrame(nmat, 
      columns=["H" + str(i+1) for i in range(MAX_SIZE)]) 
    # Actual concatenation 
    ldf = pd.concat([ldf, nframe], axis=1) 
    # and deletion on "Holiday" columns 
    del ldf["Holiday"] # only if really needed, removes Holiday column 
    # Substitution in the original array 
    df[k] = ldf 

# et voillà 
print(df) 

それは吐き出す:

{ 
    'ATM': 
    Plant Year Month H1 H2 H3 H4 H5 H6 H7 H8 
    0 01 1996 Mar 0 1 1 1 1 0 0 1 
    1 02 1997 Feb 0 1 1 1 0 1 1 NA 
    2 SP 1996 Mar 0 1 1 0 0 1 1 1 
    3 BE 1999 Mar 0 0 1 1 1 1 1 1, 
    'PDE': 
    Plant Year Month H1 H2 H3 H4 H5 H6 H7 H8 
    0 01 2001 Mar 0 1 1 1 1 1 0 1 
    1 02 2002 Mar 1 1 1 1 0 1 1 0 
    2 SP 2001 Apr 1 1 1 0 0 1 1 NA 
    3 BE 2002 June 1 0 1 1 1 1 0 0 
} 
+0

うわー!答えを受け入れていただきありがとうございます! –

関連する問題