参考
https://qiita.com/monokeshi6/items/453d1549db62442a5588
df.at[df.index[行番号],'列名']
メソッドを実行するインスタンスはリストである必要がある
(失敗例)
slist = ['str1','str2','str3','str4','str5','str6'] adlist = ['details1','details2'] →slist[0].append(adlist)を実行すると AttributeError: 'str' object has no attribute 'append'が表示
(成功例)
[slist[0]].append(adlist)
appendでは入れ子になるのを防げる
In: slist.append(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', ['details1', 'details2']]
In: slist.extend(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', 'details1', 'details2']
・インタプリタ型のpythonではforループのi,j,k呼び出しに時間がかかるので,それを短縮したもの ・可読性に欠けるので,通常のループを作ってから実装するほうが望ましい
[[【append()のカッコ内の要素】【内側for文j】【if文】]【外側for文i】]
(配列の次元+1ごとに外に[ 【for文】])を追加する
[[挿入要素 for j in range(len(df)) if(i != j)] for i in range(len(df))]
if~,else~のときは【if文】【else文】【for文】の並びにする
[[挿入要素 if(i != j) else 0 for j in range(len(df)) ]for i in range(len(df))]
【for文】【for文】と続けるときは【外側for】【内側for】で逆にする
[挿入要素 for i in range(len(df)) for j in range(len(df))]
元のfor文でappend()がないforは,1つ内側のforとつなげて【該当for文】【内側for文】となる
問題(n×1)型の配列
In: t =[[{'a':1}],[{'a':2}],[{'a':3}],[{'a':4}],[{'a':5}]]
Out: [[{'a': 1}], [{'a': 2}], [{'a': 3}], [{'a': 4}], [{'a': 5}]]
データフレーム時,aで一まとめにしてくれない
appendで新しい1次元配列に入れ直していく(内包表記で表現)
In: c = [t[i][0] for i in range(len(t))]
Out: [{'a': 1}, {'a': 2}, {'a': 3}, {'a': 4}, {'a': 5}]
データフレーム時,Columnsをaとしてまとめてくれる
参考:
https://human-blog.com/hairetsu/
例:i×j×k = 6×1×3 配列(2次元配列が6つ)の場合
trilist = [[['a', 'b', 'c']], [['d', 'e', 'f']], [['g', 'h', 'i']], [['j', 'k', 'l']], [['m', 'n', 'o']], [['p', 'q', 'r']]]
dilist = [[trilist[i][j][k] for j in range(len(trilist[i])) for k in range(len(trilist[i][j]))] for i in range(len(trilist))]
maketrilist = [[[trilist[i][j][k] for k in range(len(trilist[i][j]))] for j in range(len(trilist[i]))] for i in range(len(trilist))]
pythonのfor文は処理が呼び出し関係で時間がかかるらしい
→なるべくforを使わずに書くことが時間短縮になる
for i in range(len(df12)):
if(i%200 ==0):
print(i)
for j in range(len(df12)):
if(i != j):
for k in range(len(df12.iloc[i,:])):
if(df12.iloc[i,k]==""):
break
for l in range(len(df12.iloc[j,:])):
if(df12.iloc[i,k] == df12.iloc[j,l]):
admatrix.iloc[i,j] +=1
16時間(200要素)*40 = 640時間(26.7日:Core i7-9700K)超非効率!!for i in range(len(df12)):
if(i%200 ==0):
print(i)
for j in range(len(df12)):
if(i != j):
#print(len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""})))
admatrix.iloc[i,j]
=len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""}))
O(n^2)、n=8100で約6.67時間(200要素(10分)*40)かかる