créer de nouvelles colonnes et valeurs multiples conditionnelles basées sur des indicateurs


Kumar AK

J'ai un dataframe comme celui-ci.

import pandas as pd
from collections import OrderedDict

have = pd.DataFrame(OrderedDict({'User':['101','101','102','102','103','103','103'],
                     'Name':['A','A','B','B','C','C','C'],
                     'Country':['India','UK','US','UK','US','India','UK'],
                    'product':['Soaps','Brush','Soaps','Brush','Soaps','Brush','Brush'],
                    'channel':['Retail','Online','Retail','Online','Retail','Online','Online'],
                    'Country_flag':['Y','Y','N','Y','N','N','Y'],
                    'product_flag':['N','Y','Y','Y','Y','N','N'],
                    'channel_flag':['N','N','N','Y','Y','Y','Y']
                    }))

entrez la description de l'image ici

Je veux créer de nouvelles colonnes basées sur les drapeaux. si l'utilisateur a le drapeau Y, je veux combiner ces enregistrements respectifs.

dans l'image ci-dessous, l'utilisateur du premier enregistrement a le drapeau Y sur le pays uniquement. utilisateur |nom|pays|produit) etc.

sortie souhaitée :

entrez la description de l'image ici

Quang Hoang

Mon avis :

# columns of interest
cat_cols = ['Country', 'product', 'channel']
flag_cols = [col+'_flag' for col in cat_cols]

# select those values marked 'Y'
s = (have[cat_cols].where(have[flag_cols].eq('Y').values)
                   .stack()
                   .reset_index(level=1)
    )

# join columns and values by |
s = s.groupby(s.index).agg('|'.join)

# add the 'User' and 'Name'
s[0] = have['User'] + "|" + have['Name'] + "|" + s[0]

# unstack to turn `level_1` to columns
s = s.reset_index().set_index(['index','level_1'])[0].unstack()

# concat by rows
pd.concat((have,s), axis=1)

Production:

+----+--------+--------+-----------+-----------+-----------+----------------+----------------+----------------+-------------+-------------------+-------------------+---------------------------+--------------+-------------+--------------------+
|    |   User | Name   | Country   | product   | channel   | Country_flag   | product_flag   | channel_flag   | Country     | Country|channel   | Country|product   | Country|product|channel   | channel      | product     | product|channel    |
|----+--------+--------+-----------+-----------+-----------+----------------+----------------+----------------+-------------+-------------------+-------------------+---------------------------+--------------+-------------+--------------------|
|  0 |    101 | A      | India     | Soaps     | Retail    | Y              | N              | N              | 101|A|India | nan               | nan               | nan                       | nan          | nan         | nan                |
|  1 |    101 | A      | UK        | Brush     | Online    | Y              | Y              | N              | nan         | nan               | 101|A|UK|Brush    | nan                       | nan          | nan         | nan                |
|  2 |    102 | B      | US        | Soaps     | Retail    | N              | Y              | N              | nan         | nan               | nan               | nan                       | nan          | 102|B|Soaps | nan                |
|  3 |    102 | B      | UK        | Brush     | Online    | Y              | Y              | Y              | nan         | nan               | nan               | 102|B|UK|Brush|Online     | nan          | nan         | nan                |
|  4 |    103 | C      | US        | Soaps     | Retail    | N              | Y              | Y              | nan         | nan               | nan               | nan                       | nan          | nan         | 103|C|Soaps|Retail |
|  5 |    103 | C      | India     | Brush     | Online    | N              | N              | Y              | nan         | nan               | nan               | nan                       | 103|C|Online | nan         | nan                |
|  6 |    103 | C      | UK        | Brush     | Online    | Y              | N              | Y              | nan         | 103|C|UK|Online   | nan               | nan                       | nan          | nan         | nan                |
+----+--------+--------+-----------+-----------+-----------+----------------+----------------+----------------+-------------+-------------------+-------------------+---------------------------+--------------+-------------+--------------------+

Articles connexes