web-dev-qa-db-ja.com

Pandas以前のデータの平均を含むDataFrameの最後に列を追加します

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
12
LinnK

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
11
EdChum

@LaangeHaareまたは好奇心のある他の誰でも、私はそれをテストしたところ、受け入れられた回答のコピー部分は不要のようです(たぶん、何かが足りない...)

したがって、これを次のように簡略化できます。

df['average'] = df.mean(numeric_only=True, axis=1)

私は単にコメントとしてこれを追加したでしょうが、評判はありません

4
kt-0

一般的なケースでは、特定の列を使用したい場合は、以下を使用できます。

df['average'] = df[['F7','F8']].mean(axis=1)

ここで、axis = 1は行ごとのアクションを表します(各行の列値を使用して「平均」列の平均を計算します)

次に、この列で並べ替えることができます。

df.sort_values(by='average',ascending=False, inplace=True)

ここで、inplace = Trueは、コピーで計算するのではなく、データフレームにアクションを適用することを表します。

1
Sergey Zaitsev

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
)
0
johnDanger