2017-02-16 6 views
1

シーケンスの平均時間を計算したいAD-VV-DDAD-MM-PPです。この列は、任意の列に表示されることがありますMD_*。平均時間を計算するには、TIME_*が使用されるべきカラム:さまざまなカラムで平均値を計算する方法は?

df = 
MD_1 MD_2 MD_3 MD_4 MD_5 TIME_1 TIME_2 TIME_3 TIME_4 TIME_5 
NaN AD  VV  DD  NaN NaN  3  2  1  NaN 
AD  VV  DD  NaN NaN 1  1  1  NaN  NaN 
AD  MM  PP  NaN NaN 4  3  3  NaN  NaN 
TT  AD  MM  NaN NaN 2  4  NaN  NaN  NaN  

結果はこのようになります。

result = 
MD_1_new MD_2_new MD_3_new TIME_1_new TIME_2_new TIME_3_new 
AD   VV   DD   2   1.5   1 
AD   MM   PP   4   3   3 

次のように最初の行のTIME_*列を計算した:df二つがあります配列AD-VV-DD。列TIME_Xは、Xの値に基づいて選択され、MD_Xにあります。

これは私が試したものですが、どのように私はTIME_*対応の平均値を計算します:?

def calculate_mean_times(df): 
    # Create drop rows 
    drop_rows = [] 
    index = 0 
    for index, x in df.iterrows(): 
     row = x.dropna() 
     if ((row[0] == 'AD') & (row[1] == 'VV') & (row[2] == 'DD')): 
      drop_rows.append(index) 
     index = index + 1 
    return drop_rows 

# Drop the rows in list 
correct_rows = calculate_mean_times(df) 
df = df.loc[correct_rows,:] 
+0

あなたが何をしようとしましたか?あなたは何の結果を得ましたか? – Vaishali

+0

@VaishaliGarg私のアップデートをご覧ください。 – user7379562

答えて

1

ここにあなたの要件を満たすためにいくつかのコードです。主要な構成原則は、見つけ出す必要のある各キーに対してtupleを作成し、これらのキーを使用して辞書を構築することです。データフレームの各行について、3つの可能な場所のそれぞれにキーが存在するかどうかを確認します。キーが辞書に存在するかどうかを確認して確認します。存在する場合、後で平均化するために整列されたデータ値を保存する。

コード:

# build a dict with tuple keys for the results 
matches = { 
    ('AD', 'VV', 'DD'): [], 
    ('AD', 'MM', 'PP'): [], 
} 

# for each row check for key matches 
for i, row in df.iterrows(): 
    keys = tuple(row.values[0:5]) 
    for j in range(3): 
     try: 
      # check if these three columns match one of our tuple keys 
      # if it matches append the three columns of data 
      matches[tuple(keys[j:j+3])].append(
       row.values[5+j:8+j].astype(int)) 
      break 
     except KeyError: 
      pass 

# average the data 
avg = {} 
for k, v in matches.items(): 
    avg[k] = sum(v)/float(len(v)) 
print(avg) 

試験データ:

data = [x.strip().split() for x in """ 
    MD_1 MD_2 MD_3 MD_4 MD_5 TIME_1 TIME_2 TIME_3 TIME_4 TIME_5 
    NaN AD  VV  DD  NaN NaN  3  2  1  NaN 
    AD  VV  DD  NaN NaN 1  1  1  NaN  NaN 
    AD  MM  PP  NaN NaN 4  3  3  NaN  NaN 
    TT  AD  MM  NaN NaN 2  4  NaN  NaN  NaN 
""".split('\n')[1:-1]] 
df = pd.DataFrame(data[1:], columns=data[0]) 

出力:

{('AD', 'VV', 'DD'): array([ 2. , 1.5, 1. ]), ('AD', 'MM', 'PP'): array([ 4., 3., 3.])} 
関連する問題