ikeid
@ikeid

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

forループでDataFrameに処理適用

解決したいこと

forループでDataFrameの値を変えたい

例)
72×11列のデータフレームに対して上から順に6行ずつ取り出して、その中で各列の値(1つ除く)を偏差値化したいです。
下のようなコードを実行したところdfの値が全く変わっていませんでした。(偏差値化ができていない)。
解決方法を教えて下さい。
また処理がより早くなる方法もあればご教授いただきたいです。

該当するソースコード

list_std = ["a", "b", 'c', 'd', 'e', 'f', 'g', 'h', 'i', "j"]
for list in list_std:
    df_list = df.loc[0:5,list],df.loc[6:11,list],df.loc[12:17,list],df.loc[18:23,list],df.loc[24:29,list], df.loc[30:35,list],df.loc[36:41,list],df.loc[42:47,list],df.loc[48:53,list],df.loc[54:59,list],df.loc[60:65,list],df.loc[66:71,list]

    for e in df_list:
        df_std = e.astype(float)
        win_mean=df_std.mean()
        win_std=df_std.std()
        if win_std==0:
            e=50.0
        else:
            e = df_std.apply(lambda x : ((x - win_mean)*10/win_std+50))

自分で試したこと

for e in df_listのところを12回分手書きしたら動きはしましたがありえない位遅かったです。

0

2Answer

for文で要素を1つずつ抜き出してその要素を更新しても、もとの集合の値が変わるわけではありません。

l = [1,2,3]

for i in l:
    i += 1
    print(i)
    
print(l)
出力
2
3
4
[1, 2, 3]

コードにdfを更新するところがないので、求めた値でdfを更新してあげるようにすればうまくいくと思います。

0Like

Comments

  1. @ikeid

    Questioner

    回答ありがとうございます。
    dfを12分割したそれぞれについてdfを更新するやり方が分かりません。
    df = ~~
    のdfのところの記述が私の質問のコードのように
    e = ~~
    ではいけない場合どうすればdfを更新できますか?

6行ずつ、各列の平均を取った値をdataframeに追加するような処理を書いてみました。
もっとスマートなやり方があるかもしれませんが、これでも6行ずつの平均は取れてると思います。
参考になれば幸いです。

import pandas as pd
df = pd.DataFrame()
df['a'] = [1,2,3,4,5,6,7,8,9,10,11,12]
df['b'] = [4,5,6,7,8,9,10,11,12,13,14,15]
df['c'] = [7,8,9,10,11,12,13,14,15,16,17,18]

df_new =  pd.DataFrame()

for i in range(len(df)//6):
    s = pd.Series()
    for c in df.columns:
        s[c] = df.iloc[i*6:i*6+6][c].mean()

    df_new = df_new.append(df.iloc[i*6:i*6+6].append(s, ignore_index=True))

image.png

6行ごとの平均などを間に挟む必要がなければ、appendの部分はもう少し簡略できます。

import pandas as pd
df = pd.DataFrame()
df['a'] = [1,2,3,4,5,6,7,8,9,10,11,12]
df['b'] = [4,5,6,7,8,9,10,11,12,13,14,15]
df['c'] = [7,8,9,10,11,12,13,14,15,16,17,18]

for i in range(len(df)//6):
    s = pd.Series()
    for c in df.columns:
        s[c] = df.iloc[i*6:i*6+6][c].mean()

    df = df.append(s, ignore_index=True)

image.png

0Like

Comments

  1. @ikeid

    Questioner

    なるほど、すっきりわかりました。
    ご丁寧にありがとうございました。

Your answer might help someone💌