たとえば、2つのデータフレームがあります
df1:
0 1 2 3
0 Name Unit Attribute Date
1 a A xxy xxx
2 b B xyx xxx
3 c C xxx xxx
4 d D yxx xxx
5 e E yxy yyy
df2:
0 1 2
Name Unit Date
0 a F xxx
1 b G xxx
2 e H xxx
3 f I xxx
df1のエントリをdf2の対応するエントリで上書きしたいと思います。
たとえば、df1.loc [5,3]をdf2.loc [2,2]で上書きします。つまり、同じ「名前」を持つ行の場合、df1がdf2にある場合は、df1の同じ列を上書きします。
現在、私はこれを愚かな方法で行っています:
def find_column_num(key, df_name, start_row, stop_row, start_column, stop_column):
for i in range(start_row,stop_row+1):
for j in range(start_column, stop_column+1):
if df_name.loc[i,j]== key:
column_num_with_key = j
return column_num_with_key
break
for i in range(0,len(df1.index)):
for ii in range(0,len(df2.index)):
if df1.loc[i,0] == df2.loc[ii,0]:
for j in range(0,len(df1.columns)):
if df1.loc[0,j] in df2.loc[0,:]:
df1.set_value(i,j, df2.loc[ii,find_column_num(df1.loc[0,j],df2,0,0,0,len(df2.columns))]
私はそれを誇りに思っていません。私は少し調べて、「=」をset_value()に置き換えることを思いつきました。これは役に立ちます。他の提案をお待ちしております。実際の問題のサイズは200行30列です。したがって、すべてのforループを実行するには20秒かかります。
IIUC、使用merge
およびfillna
。データを少しクリーンアップする必要があります。これが私が参考のために使ったものです。
df1
Name Unit Attribute Date
0 a A xxy xxx
1 b B xyx xxx
2 d C xxx xxx
3 e D yxx xxx
4 e E yxy xxx
df2
Name Unit Date
0 a F xxx
1 b G xxx
2 e H xxx
3 f H xxx
out = df1[['Name', 'Attribute']].merge(df2, how='left').fillna(df1)
out
Name Attribute Unit Date
0 a xxy F xxx
1 b xyx G xxx
2 d xxx C xxx
3 e yxx H xxx
4 e yxy H xxx
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加