2017-07-01 14 views
0

テーブルとパラメータの先頭に数値を保持するテーブルがExcelにあります。 このように見え、AからEまでのセルだけを使う必要があります。ご覧のように、Fはヘッダー付きの行にありますが、(前述のように)反復する特定のセルを選択する必要があります。パンダの列見出しにそれぞれパラメータの配列を作成

A    B C   D    E   F 
1 50    30 10   5    1   String 
2 Oval, Round NaN Irregular Nan    Nan   String2 
3 Circumscribed NaN Nan   Nan    Obscured, Microlobulated 
4 High density NaN Equal  Nan    Fat-containing 

私は、コラムヘッドにそれぞれ2つの配列を作成する必要があります。

:今、私はこの機能を持っているため

prob_arr = [50, 1, 1] 
val_arr = ['Circumscribed', 'Obscured', 'Microlobulated'] 

prob_arr = [50, 50, 10] 
val_arr = ['Oval', 'Round', 'Irregular'] 

そして、3行目のために、それは次のようになります。それは2行目だ場合たとえば、私は2つの配列として出力を持っている必要があります

def concatvals(row, col, width, start, stop): 
    prob_head = list(df)[start:stop] 
    for i in range(width): 
     value_temp = df.iloc[row, col] 
     if isinstance(value_temp, float) is False: 
      value = [x.strip() for x in value_temp.split(',')] 
      len_val = len(value) 
      prob_arr = [prob_head[i] for _ in range(len_val)] 
      val_arr = [value[x] for x in range(len_val)] 
     col += 1 

    randparameter = random.choices(val_arr, prob_arr, k=1) 
    return randparameter 

そしてarrsは正しく作成されません。助言がありますか?

+0

編集、ありがとう。 –

答えて

1
import pandas as pd 


def concatvals(df, row_idx, col_start_idx, col_end_idx): 
    """ 
    Input parameter `df` is table data as `pd.DataFrame`. 
    Input parameter `row_idx` is index of requested dataframe row as `int`. 
    Input parameter `col_start_idx` is index of first requested column as `int`. 
    Input parameter `col_end_idx` is index of last requested column as `int`. 
    """ 

    # Initialize return variables as empty lists 
    prob_arr = [] 
    val_arr = [] 

    # Extract slice from a single dataframe row as Series object 
    row = df.iloc[row_idx, col_start_idx: col_end_idx + 1] 

    # Iterate through all header-value pairs of the row Series 
    for header, value in row.iteritems(): 
     # If value is a string 
     if isinstance(value, str): 
      # Split string value upon commas 
      subs = [x.strip() for x in value.split(',')] 

      # Append current header to return list 
      # (as many times as there are strings in `subs`) 
      prob_arr += len(subs) * [header] 

      # Append comma-delimited strings to return list 
      val_arr += subs 

    return prob_arr, val_arr 


if __name__ == '__main__': 
    # Read excel worksheet into dataframe 
    df = pd.read_excel('test.xlsx') 

    # Convert first row (which has row index 0) 
    prob_arr1, val_arr1 = concatvals(df, row_idx=0, col_start_idx=0, col_end_idx=4) 
    print(prob_arr1) 
    print(val_arr1) 

    # Convert second row (which has row index 1) 
    prob_arr2, val_arr2 = concatvals(df, row_idx=1, col_start_idx=0, col_end_idx=4) 
    print(prob_arr2) 
    print(val_arr2) 

出力が得られます。

[50, 50, 10] 
['Oval', 'Round', 'Irregular'] 
[50, 1, 1] 
['Circumscribed', 'Obscured', 'Microlobulated'] 
+0

本当の宝石のようですね!これについてもっと説明できますか?例えば、私がヘッダーの範囲を持っていれば? –

+0

コードに説明的なコメントを追加しました。 「ヘッダーの範囲」が意味することは、私にはまだ完全にはっきりしていません。これを説明できますか? (好ましくは例もあります) – Xukrao

+0

ありがとうございます。私はこれらの特定のヘッダー値を持つすべての行を持っていません。だから、その行が整数を保持するセルで続行され、特定の数のヘッダー(A1:E1)を選択する必要があるとします。 –

関連する問題