同じ名前の列を持つデータフレームがある場合、同じ名前の列をある種の関数(つまり合計)と組み合わせる方法はありますか?
たとえば:
In [186]:
df["NY-WEB01"].head()
Out[186]:
NY-WEB01 NY-WEB01
DateTime
2012-10-18 16:00:00 5.6 2.8
2012-10-18 17:00:00 18.6 12.0
2012-10-18 18:00:00 18.4 12.0
2012-10-18 19:00:00 18.2 12.0
2012-10-18 20:00:00 19.2 12.0
列名が同じである各行を合計して、NY-WEB01列(NY-WEB01だけでなく、重複する列が多数ある)を折りたたむにはどうすればよいですか?
私はこれがあなたが求めていることをしていると信じています:
_df.groupby(lambda x:x, axis=1).sum()
_
または、dfの長さに応じて3%から15%速くなります。
_df.groupby(df.columns, axis=1).sum()
_
編集:これを合計を超えて拡張するには、.agg()
(.aggregate()
の略)を使用します。
_df.groupby(df.columns, axis=1).agg(numpy.max)
_
GroupBy
とlevel
およびaxis
引数ここではラムダは必要ありません。また、明示的に_df.columns
_をクエリする必要もありません。 groupby
level
引数と組み合わせて指定できるaxis
引数を受け入れます。これはもっときれいです、IMO。
_# Setup
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('AABBB'))
df
A A B B B
0 44 47 0 3 3
1 39 9 19 21 36
2 23 6 24 24 12
3 1 38 39 23 46
4 24 17 37 25 13
_
_df.groupby(level=0, axis=1).sum()
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
_
MultiIndex
列の処理考慮すべきもう1つのケースは、MultiIndex
列を処理する場合です。検討する
_df.columns = pd.MultiIndex.from_arrays([['one']*3 + ['two']*2, df.columns])
df
one two
A A B B B
0 44 47 0 3 3
1 39 9 19 21 36
2 23 6 24 24 12
3 1 38 39 23 46
4 24 17 37 25 13
_
上位レベル全体で集計を実行するには、
_df.groupby(level=1, axis=1).sum()
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
_
または、上位レベルごとにのみ集計する場合は、
_df.groupby(level=[0, 1], axis=1).sum()
one two
A B B
0 91 0 6
1 48 19 57
2 29 24 36
3 39 39 69
4 41 37 38
_
(集計を実行せずに)重複する列を単純に削除する方法を探してここに来た場合は、 _Index.duplicated
_ を使用してください。
_df.loc[:,~df.columns.duplicated()]
A B
0 44 0
1 39 19
2 23 24
3 1 39
4 24 37
_
または、最後のものを保持するには、_keep='last'
_(デフォルトは_'first'
_)を指定します。
_df.loc[:,~df.columns.duplicated(keep='last')]
A B
0 47 3
1 9 36
2 6 12
3 38 46
4 17 13
_
上記の2つのソリューションのgroupby
の選択肢は、それぞれdf.groupby(level=0, axis=1).first()
と... .last()
です。
sum
、mean
、median
、max
、min
、std
などの一般的な集計関数のより簡単な解決策があります-列とlevel
の操作にはパラメーター_axis=1
_のみを使用してください:
_#coldspeed samples
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('AABBB'))
print (df)
print (df.sum(axis=1, level=0))
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
df.columns = pd.MultiIndex.from_arrays([['one']*3 + ['two']*2, df.columns])
print (df.sum(axis=1, level=1))
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
print (df.sum(axis=1, level=[0,1]))
one two
A B B
0 91 0 6
1 48 19 57
2 29 24 36
3 39 39 69
4 41 37 38
_
インデックスで機能するのと同様に、代わりに_axis=0
_を使用します_axis=1
_:
_np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('ABCDE'), index=list('aabbc'))
print (df)
A B C D E
a 44 47 0 3 3
a 39 9 19 21 36
b 23 6 24 24 12
b 1 38 39 23 46
c 24 17 37 25 13
print (df.min(axis=0, level=0))
A B C D E
a 39 9 0 3 3
b 1 6 24 23 12
c 24 17 37 25 13
df.index = pd.MultiIndex.from_arrays([['bar']*3 + ['foo']*2, df.index])
print (df.mean(axis=0, level=1))
A B C D E
a 41.5 28.0 9.5 12.0 19.5
b 12.0 22.0 31.5 23.5 29.0
c 24.0 17.0 37.0 25.0 13.0
print (df.max(axis=0, level=[0,1]))
A B C D E
bar a 44 47 19 21 36
b 23 6 24 24 12
foo b 1 38 39 23 46
c 24 17 37 25 13
_
必要に応じて、first
、last
、size
、count
などの別の関数を使用する必要があります coldspeed answer