My question is under Locations column how can i add column names where row value is 1 , for example against Japan/US , Newyork,Osaka should be printed under Locations column....Pls advice how to solve this in Python ?
            Asked
            
        
        
            Active
            
        
            Viewed 309 times
        
    -1
            
            
        - 
                    2please add data (not an image) to your question – anon01 Feb 16 '21 at 08:29
- 
                    As a new user you should read [ask], and when it comes to Pandas [How to make good reproducible pandas examples](https://stackoverflow.com/q/20109391/3545273). We often need to reproduce and because of that need copyable (text) data. – Serge Ballesta Feb 16 '21 at 08:32
- 
                    Thanks Serge Ballesta for the suggestion – amrev15 Feb 20 '21 at 17:53
3 Answers
0
            
            
        Try this:
import pandas as pd
DF = pd.DataFrame
S = pd.Series
def construct_df() -> DF:
    data = {
        "Countries": ["Japan/US", "Australia & NZ", "America & India"],
        "Portugal": [0, 0, 0],
        "Newyork": [1, 0, 1],
        "Delhi": [0, 0, 0],
        "Osaka": [1, 0, 1],
        "Bangalore": [0, 0, 0],
        "Sydney": [0, 0, 0],
        "Mexico": [0, 0, 0],
    }
    return pd.DataFrame(data)
def calc_locations(x: DF) -> S:
    x__location_cols_only = x.select_dtypes("integer")
    x__ones_as_location_col_name = x__location_cols_only.apply(
        lambda ser: ser.replace({0: "", 1: ser.name})
    )
    location_cols = x__location_cols_only.columns.tolist()
    ret = x__ones_as_location_col_name[location_cols[0]]
    for colname in location_cols[1:]:
        col = x__ones_as_location_col_name[colname]
        ret = ret.str.cat(col, sep=",")
    ret = ret.str.replace(r",+", ",").str.strip(",")
    return ret
df_final = construct_df().assign(Locations=calc_locations)
assert df_final["Locations"].tolist() == ["Newyork,Osaka", "", "Newyork,Osaka"]
 
    
    
        Austin Ray
        
- 46
- 1
- 2
0
            
            
        Lets say your data is like below
import pandas as pd
data = {'Countries':  ['JP/US', 'Aus/NZ', 'America/India'],
         'Portugal': [0, 0, 0],
         'Newyork': [1, 0, 1],
         'Delhi': [0, 0, 1],
         'Osaka': [1, 0, 0],
         'Sydney': [0, 0, 0],
         'Mexico': [0, 0, 0],
        }
data_df = pd.DataFrame(data)
DF looks like (request you to provide above set of data to build a DF for us to provide you results):
       Countries  Delhi  Mexico  Newyork  Osaka  Portugal  Sydney
0          JP/US      0       0        1      1         0       0
1         Aus/NZ      0       0        0      0         0       0
2  America/India      1       0        1      0         0       0
If you execute below statements
data_df = data_df.set_index('Countries')
data_df['Locations'] = data_df.apply(lambda x: ", ".join(x[x!=0].index.tolist()), axis=1)
Your output will look like below
               Delhi  Mexico  Newyork  Osaka  Portugal  Sydney       Locations
Countries                                                                     
JP/US              0       0        1      1         0       0  Newyork, Osaka
Aus/NZ             0       0        0      0         0       0                
America/India      1       0        1      0         0       0  Delhi, Newyork
 
    
    
        Ankit Doshi
        
- 1
- 4
- 
                    Thanks Ankit for the solution, I had two more question Q1 : how can we convert the existing data automatically in below mentioned format data = {'Countries': ['JP/US', 'Aus/NZ', 'America/India'], 'Portugal': [0, 0, 0], 'Newyork': [1, 0, 1], 'Delhi': [0, 0, 1], 'Osaka': [1, 0, 0], 'Sydney': [0, 0, 0], 'Mexico': [0, 0, 0], } data_df = pd.DataFrame(data) – amrev15 Feb 17 '21 at 09:53
- 
                    https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.to_dict.html Sorry for the late reply. Also if my answer helped you please do Upvote it. Thanks – Ankit Doshi Sep 12 '21 at 18:45
0
            
            
        You can do:
data = {
        "Countries": ["Japan/US", "Australia & NZ", "America & India"],
        "Portugal": [0, 0, 0],
        "Newyork": [1, 0, 1],
        "Delhi": [0, 0, 0],
        "Osaka": [1, 0, 1],
        "Bangalore": [0, 0, 0],
        "Sydney": [0, 0, 0],
        "Mexico": [0, 0, 0],
    }
df=pd.DataFrame(data)
df1=df.iloc[:,1:]*df.iloc[:,1:].columns
df['Location']=df1.values.tolist()
df['Location']=df['Location'].apply(lambda x:','.join([y for y in x if len(y)>1]))
 
    
    
        Suhas Mucherla
        
- 1,383
- 1
- 5
- 17
