DataFrameを持っているave_data
には以下が含まれます。
ave_data
Time F7 F8 F9
00:00:00 43.005593 -56.509746 25.271271
01:00:00 55.114918 -59.173852 31.849262
02:00:00 63.990762 -64.699492 52.426017
このデータフレームに、各行のF7、F8、およびF9列の下の値の平均を含む別の列を追加したいと思います。
ave_data
DataFrameは後でコードが別のExcelファイルから読み取るときにサイズを変更する可能性があるため、メソッドはジェネリックである必要があります(つまり、平均を含む列を、列番号4ではなく、DataFrameの最後の列として常に追加します)。
desired output
Time F7 F8 F9 Average
00:00:00 43.005593 -56.509746 25.271271 4.25
01:00:00 55.114918 -59.173852 31.849262 9.26
02:00:00 63.990762 -64.699492 52.426017 17.24
copy()
を使用してdfのコピーを取得し、次にmean
を呼び出してパラメーターaxis=1
およびnumeric_only=True
を渡すだけで、平均が行ごとに計算され、非数値列を無視するには、次の操作を行うと、列が常に最後に追加されます。
In [68]:
summary_ave_data = df.copy()
summary_ave_data['average'] = summary_ave_data.mean(numeric_only=True, axis=1)
summary_ave_data
Out[68]:
Time F7 F8 F9 average
0 2015-07-29 00:00:00 43.005593 -56.509746 25.271271 3.922373
1 2015-07-29 01:00:00 55.114918 -59.173852 31.849262 9.263443
2 2015-07-29 02:00:00 63.990762 -64.699492 52.426017 17.239096
@LaangeHaareまたは好奇心のある他の誰でも、私はそれをテストしたところ、受け入れられた回答のコピー部分は不要のようです(たぶん、何かが足りない...)
したがって、これを次のように簡略化できます。
df['average'] = df.mean(numeric_only=True, axis=1)
私は単にコメントとしてこれを追加したでしょうが、評判はありません
一般的なケースでは、特定の列を使用したい場合は、以下を使用できます。
df['average'] = df[['F7','F8']].mean(axis=1)
ここで、axis = 1は行ごとのアクションを表します(各行の列値を使用して「平均」列の平均を計算します)
次に、この列で並べ替えることができます。
df.sort_values(by='average',ascending=False, inplace=True)
ここで、inplace = Trueは、コピーで計算するのではなく、データフレームにアクションを適用することを表します。
df.assign
は特にこの目的のためです。元のデータフレームの変更やSettingWithCopyWarning
の発生を回避するためにコピーを返します。次のように機能します。
data_with_ave = ave_data.assign(average = ave_data.mean(axis=1, numeric_only=True))
この関数は、同時に複数の列を作成することもできます。
data_with_ave = ave_data.assign(
average = ave_data.mean(axis=1, numeric_only=True),
median = ave_data.median(axis=1, numeric_only=True)
)
pandas 0.36以降、作成した列を参照して別の列を作成することもできます。
data_with_ave = ave_data.assign(
average = ave_data.mean(axis=1, numeric_only=True),
isLarge = lambda df: df['average'] > 10
)