J'ai un dataframe python et certaines colonnes font référence à des échantillons répétés comme ci-dessous:

In [3]: df = pd.DataFrame(
   ...:     [[89, 89, 12, 34, 32],
   ...:      [788, 25, 55, 65, 55],
   ...:      [588, 23, 58, 8, 55],
   ...:      [25, 14, 45, 123, 58]],
   ...:     columns = ['sample1','sample2.1','sample2.2','sample3','sample4'],
   ...: )
In [4]: df
   sample1  sample2.1  sample2.2  sample3  sample4
0       89         89         12       34       32
1      788         25         55       65       55
2      588         23         58        8       55
3       25         14         45      123       58

Pour les échantillons répétés, sample2.1 et sample2.2, je veux rester avec une moyenne des deux, c'est-à-dire

   sample1  sample2_averaged  sample3  sample4
0       89              50.5       34       32
1      788              40.0       65       55
2      588              40.5        8       55
3       25              29.5      123       58

Je pense utiliser regex mais je ne les ai jamais utilisés sur des dataframes python

0
R Odongo 3 juin 2020 à 01:00

3 réponses

Meilleure réponse

Vous pouvez grouper par colonnes si vous fournissez axis=1, par exemple:

>>> df.groupby(df.columns.str.replace(r'\..+', ''), axis=1).mean()
    sample1 sample2 sample3 sample4
0   89.0    50.5    34.0    32.0
1   788.0   40.0    65.0    55.0
2   588.0   40.5    8.0 55.0
3   25.0    29.5    123.0   58.0

Les colonnes et les index Pandas peuvent utiliser pandas.Series.str méthodes d'accesseur de chaîne, y compris regex.

3
Michael Delgado 2 juin 2020 à 22:16

Essayer:

import re
from itertools import groupby

res=pd.DataFrame(index=df.index, columns=[])
for k,v in groupby(df.columns, key=lambda el: re.sub(r"\.[^\.]+$", "", el)):
    v=list(v)
    if(len(v)==1):
        res[k]=df[v[0]]
    else:
        res[k]=df[v].mean(axis=1)

Les sorties:

>>> res

   sample1  sample2  sample3  sample4
0       89     50.5       34       32
1      788     40.0       65       55
2      588     40.5        8       55
3       25     29.5      123       58
0
Grzegorz Skibinski 2 juin 2020 à 22:27

Je ferais:

(df.T.groupby(df.columns.str.extract('^([^\.]+)')[0].values)
   .mean().T
)

Production:

    sample1  sample2  sample3  sample4
0     89.0     50.5     34.0     32.0
1    788.0     40.0     65.0     55.0
2    588.0     40.5      8.0     55.0
3     25.0     29.5    123.0     58.0
0
Quang Hoang 2 juin 2020 à 22:10