dfサイズが非常に大きいと仮定して、2つのforループを置き換える最速のコードがあるかどうか疑問に思います。私の実際のケースでは、各データフレームは200行と25列です。列のサブセットに基づいてデータフレームをマージして更新する
data_df1 = np.array([['Name','Unit','Attribute','Date'],['a','A',1,2014],['b','B',2,2015],['c','C',3,2016],\
['d','D',4,2017],['e','E',5,2018]])
data_df2 = np.array([['Name','Unit','Date'],['a','F',2019],['b','G',2020],['e','H',2021],\
['f','I',2022]])
df1 = pd.DataFrame(data=data_df1)
print('df1:')
print(df1)
df2 = pd.DataFrame(data=data_df2)
print('df2:')
print(df2)
row_df1 = [1,2,5]
col_df1 = [1,3]
row_df2 = [1,2,3]
col_df2 = [1,2]
for i in range(0,len(row_df1)):
for j in range(0, len(col_df1)):
df1.set_value(row_df1[i],col_df1[j], df2.loc[row_df2[i],col_df2[j]])
print('df1 after operation:')
print(df1)
予想される出力:私が試してみました
df1:
0 1 2 3
0 Name Unit Attribute Date
1 a A 1 2014
2 b B 2 2015
3 c C 3 2016
4 d D 4 2017
5 e E 5 2018
df2:
0 1 2
0 Name Unit Date
1 a F 2019
2 b G 2020
3 e H 2021
4 f I 2022
df1 after operation:
0 1 2 3
0 Name Unit Attribute Date
1 a F 1 2019
2 b G 2 2020
3 c C 3 2016
4 d D 4 2017
5 e H 5 2021
:
df1.loc[[1,2,5],[1,3]] = df2.loc[[1,2,3],[1,2]]
print('df1:')
print(df1)
print('df2:')
print(df2)
しかし、結果は以下の通りです。予期しないナンがある。
df1:
0 1 2 3
0 Name Unit Attribute Date
1 a F 1 NaN
2 b G 2 NaN
3 c C 3 2016
4 d D 4 2017
5 e NaN 5 NaN
df2:
0 1 2
0 Name Unit Date
1 a F 2019
2 b G 2020
3 e H 2021
4 f I 2022
ありがとうございます。
@John私はあなたの出力を得る方法を示しました。 –
@ジョンあなたが間違った答えを得ようとしていると主張するなら、それはあなたのデータであり、私の問題ではないからです。私はあなたがこれをやっている2回目であり、質問に答える努力と、それに付随する情報の乱れを認めないことに注意してください。 –
@COLDSPEED私は本当にあなたの助けに感謝します。 df1.T.reset_index()を使用した後の私のノートブックに表示される結果は、Tが最初の列のインデックス0,1,2,3を持たないこと、つまり 'Name'、 'Unit' .etcはdf1.columns.valuesとして返された結果です。 – John