33

同じ名前の列を持つデータフレームがある場合、同じ名前の列をある種の関数(つまり合計)と組み合わせる方法はありますか?

たとえば、次のようになります。

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だけでなく、重複する列がたくさんある)を折りたたむにはどうすればよいですか?

4

3 に答える 3

48

私はこれがあなたが求めていることをしていると信じています:

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)
于 2012-10-26T09:02:36.623 に答える
18

パンダ>=0.20:df.groupby(level=0, axis=1)

ここではラムダは必要ありません。また、明示的にクエリを実行する必要もありませんdf.columns。引数と組み合わせて指定できる引数をgroupby受け入れます。これはもっときれいです、IMO。levelaxis

# 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

上記groupbyの2つのソリューションの代替案は、それぞれ、、 df.groupby(level=0, axis=1).first()および... .last()です。

于 2019-01-22T02:28:21.177 に答える
3

sum、、、、、、などの一般mean的な集計関数のより単純な解決策がありmedianますmax-min列と:を操作するためのstdパラメーターのみを使用しますaxis=1level

#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アンサー使用する必要がありますsizecount

于 2019-04-05T10:36:41.923 に答える