2017-08-23 18 views
0

を(パンダのデータフレーム)のデータを整理: enter image description here私は、次の形式のデータを持っている

  product/productId           B000EVS4TY 
1   product/title Arrowhead Mills Cookie Mix, Chocolate Chip, 1... 
2   product/price           unknown 
3   review/userId          A2SRVDDDOQ8QJL 
4  review/profileName           MJ23447 
5  review/helpfulness            2/4 
6    review/score            4.0 
7    review/time           1206576000 
8   review/summary        Delicious cookie mix 
9    review/text I thought it was funny that I bought this pro... 
10  product/productId           B0000DF3IX 
11   product/title       Paprika Hungarian Sweet 
12   product/price           unknown 
13   review/userId          A244MHL2UN2EYL 
14  review/profileName       P. J. Whiting "book cook" 
15  review/helpfulness            0/0 
16   review/score            5.0 
17    review/time           1127088000 

私は、このような第一列のエントリが

 product/productId           
     product/title 
     product/price            
     review/userId          
    review/profileName            
    review/helpfulness             
     review/score                
     review/time           
     review/summary        
      review/text 

そのデータフレームに変換したいです表内の各ヘッダーに対応して値が配列された列ヘッダーです。

+2

transpose、df.Tが必要ですね。 – Vaishali

+0

あなたが提供した例の行が任意のファイル形式で保存されているかどうかわかりませんでしたか?それは任意の列区切り文字を持っていますか? – Pedro

+0

データは(.txt)形式で積み重ねられます(連続的に) –

答えて

0

私の提案はどちらも非常に似ているので、私は両方のシナリオに対処しようとします。

ファイルが実際にそれの内側の行番号を持っていない場合には、これはそれを行う必要があります。

filepath = "./untitled.txt" # you need to change this to your file path 
column_separator="\s{3,}" # we'll use a regex, I explain some caveats of this below... 

# engine='python' surpresses a warning by pandas 
# header=None is that so all lines are considered 'data' 
df = pd.read_csv(filepath, sep=column_separator, engine="python", header=None) 

df = df.set_index(0)   # this takes column '0' and uses it as the dataframe index 
df = df.T      # this makes the data look like you were asking (goes from multiple rows+1column to multiple columns+1 row) 
df = df.reset_index(drop=True) # this is just so the first row starts at index '0' instead of '1' 

# you could just do the last 3 lines with: 
# df = df.set_index(0).T.reset_index(drop=True) 

あなたは行番号を持っている場合は、我々だけでいくつかの小さな調整

を行う必要がありますこの最後の場合に
filepath = "./untitled1.txt" 
column_separator="\s{3,}" 

df = pd.read_csv(filepath, sep=column_separator, engine="python", header=None, index_col=0) 
df.set_index(1).T.reset_index(drop=True) #I did all the 3 steps in 1 line, for brevity 
  • 、私はあなたが、あなたが提供される例では(それらのすべてにNUを行番号を持つためにそれを変更助言しますmbering 2行目から始まり、これはあなたが正規表現について

  • を使用している場合がありますどのようなツールでデータをエクスポートし、警告は「その\ sの{3、}であるときは、ヘッダを処理する方法についての選択肢かもしれません列セパレータを決定するために3つ以上の連続する空白のブロックを探します。ここで問題となるのは、データを少し調べて列を見つけることです。たとえば、3つの連続した空白が表示された場合、pandasは例外を発生させます。なぜなら、行には他の列より1つ多くの列があるからです。これを解決するための1つの解決策は、他の「適切な」数値に増加させることですが、それでもデータに依存します(たとえば、3つ以上の例では、「レビュー/テキスト」には2つの列あなたは

    が何であれ、「行番号のシナリオは、」あなたが持っている、あなたは常に同じ番号を持っていることを確認する必要があります「スタック」でどのような意味を実現した後)

編集を識別しますすべてのレジスタの列を削除し、連続データフレームの形状を次のように変更します。

number_of_columns = 10    # you'll need to make sure all "registers" do have the same number of columns otherwise this will break 
new_shape = (-1,number_of_columns) # this tuple will mean "whatever number of lines", by 10 columns 
final_df = pd.DataFrame(data = df.values.reshape(new_shape) 
        ,columns=df.columns.tolist()[:-10]) 

また、すべての行の列数が同じであることを確認してください(たとえば、10列と仮定した場合、入力したデータだけのファイルは機能しません)。また、このソリューションでは、すべての列の名前が同じであることが前提です。

関連する問題