Using a list as a string of the name and the elements within the list

Multi tool use
Multi tool use












1














Is there a way to make a list of lists and then loop through them.



Essentially I need to use the elements of multiple lists as a condition but also use the name of the as a string / column name.



I Know the example below can be done in a easier way, but I think it needs this approach as my task is a bit more complex than the below



 df=

name
0 Alice
1 Fred
2 George

male=['fred','george']
female=['alice','emily']


alllists=[male, female]

for i in alllists:
df[i]=0

df.loc[df['Name'].str.contains('|'.join(i),na=False),l]=1


Output df



    name    Male   Female  
0 Alice 0 1
1 Fred 1 0
2 George 1 0









share|improve this question





























    1














    Is there a way to make a list of lists and then loop through them.



    Essentially I need to use the elements of multiple lists as a condition but also use the name of the as a string / column name.



    I Know the example below can be done in a easier way, but I think it needs this approach as my task is a bit more complex than the below



     df=

    name
    0 Alice
    1 Fred
    2 George

    male=['fred','george']
    female=['alice','emily']


    alllists=[male, female]

    for i in alllists:
    df[i]=0

    df.loc[df['Name'].str.contains('|'.join(i),na=False),l]=1


    Output df



        name    Male   Female  
    0 Alice 0 1
    1 Fred 1 0
    2 George 1 0









    share|improve this question



























      1












      1








      1







      Is there a way to make a list of lists and then loop through them.



      Essentially I need to use the elements of multiple lists as a condition but also use the name of the as a string / column name.



      I Know the example below can be done in a easier way, but I think it needs this approach as my task is a bit more complex than the below



       df=

      name
      0 Alice
      1 Fred
      2 George

      male=['fred','george']
      female=['alice','emily']


      alllists=[male, female]

      for i in alllists:
      df[i]=0

      df.loc[df['Name'].str.contains('|'.join(i),na=False),l]=1


      Output df



          name    Male   Female  
      0 Alice 0 1
      1 Fred 1 0
      2 George 1 0









      share|improve this question















      Is there a way to make a list of lists and then loop through them.



      Essentially I need to use the elements of multiple lists as a condition but also use the name of the as a string / column name.



      I Know the example below can be done in a easier way, but I think it needs this approach as my task is a bit more complex than the below



       df=

      name
      0 Alice
      1 Fred
      2 George

      male=['fred','george']
      female=['alice','emily']


      alllists=[male, female]

      for i in alllists:
      df[i]=0

      df.loc[df['Name'].str.contains('|'.join(i),na=False),l]=1


      Output df



          name    Male   Female  
      0 Alice 0 1
      1 Fred 1 0
      2 George 1 0






      python string pandas list loops






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 at 14:54









      jpp

      90.5k2052101




      90.5k2052101










      asked Nov 22 at 14:47









      fred.schwartz

      2958




      2958
























          2 Answers
          2






          active

          oldest

          votes


















          1














          While there is a way, it's not recommended. Just use a dictionary:



          d = {'male': ['fred', 'george'],
          'female': ['alice', 'emily']}

          for k, v in d.items():
          mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
          df[k.capitalize()] = mask.astype(int)


          mask.astype(int) works because a Boolean array may be mapped directly to 1 / 0, just as bool is a subclass of int in regular Python.



          Result:



          print(df)

          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer

















          • 1




            Thanks alot this worked very nicely
            – fred.schwartz
            Nov 22 at 16:35



















          1














          You can use pandas.get_dummies.



          >>> males = {'fred', 'george'}
          >>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
          >>> result = pd.concat([df, fm], axis=1)
          >>>
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          This can be done much more elegantly by using a better data structure, like a dict to map names to sexes:



          >>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
          >>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          If we have to start from



          male = ['fred','george']
          female = ['alice','emily']


          you can build sex like this:



          >>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
          ...: for name in names}
          ...:
          >>> sex
          {'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}


          Finally, if the order of the columns is important, you can reindex the result.



          >>> result = result.reindex(columns=['name', 'Male', 'Female'])
          >>> result
          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer



















          • 1




            Thanks for explaining this makes a lot of sense
            – fred.schwartz
            Nov 22 at 16:35











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433414%2fusing-a-list-as-a-string-of-the-name-and-the-elements-within-the-list%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          While there is a way, it's not recommended. Just use a dictionary:



          d = {'male': ['fred', 'george'],
          'female': ['alice', 'emily']}

          for k, v in d.items():
          mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
          df[k.capitalize()] = mask.astype(int)


          mask.astype(int) works because a Boolean array may be mapped directly to 1 / 0, just as bool is a subclass of int in regular Python.



          Result:



          print(df)

          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer

















          • 1




            Thanks alot this worked very nicely
            – fred.schwartz
            Nov 22 at 16:35
















          1














          While there is a way, it's not recommended. Just use a dictionary:



          d = {'male': ['fred', 'george'],
          'female': ['alice', 'emily']}

          for k, v in d.items():
          mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
          df[k.capitalize()] = mask.astype(int)


          mask.astype(int) works because a Boolean array may be mapped directly to 1 / 0, just as bool is a subclass of int in regular Python.



          Result:



          print(df)

          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer

















          • 1




            Thanks alot this worked very nicely
            – fred.schwartz
            Nov 22 at 16:35














          1












          1








          1






          While there is a way, it's not recommended. Just use a dictionary:



          d = {'male': ['fred', 'george'],
          'female': ['alice', 'emily']}

          for k, v in d.items():
          mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
          df[k.capitalize()] = mask.astype(int)


          mask.astype(int) works because a Boolean array may be mapped directly to 1 / 0, just as bool is a subclass of int in regular Python.



          Result:



          print(df)

          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer












          While there is a way, it's not recommended. Just use a dictionary:



          d = {'male': ['fred', 'george'],
          'female': ['alice', 'emily']}

          for k, v in d.items():
          mask = df['name'].str.lower().str.contains('|'.join(v), na=False)
          df[k.capitalize()] = mask.astype(int)


          mask.astype(int) works because a Boolean array may be mapped directly to 1 / 0, just as bool is a subclass of int in regular Python.



          Result:



          print(df)

          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 at 14:52









          jpp

          90.5k2052101




          90.5k2052101








          • 1




            Thanks alot this worked very nicely
            – fred.schwartz
            Nov 22 at 16:35














          • 1




            Thanks alot this worked very nicely
            – fred.schwartz
            Nov 22 at 16:35








          1




          1




          Thanks alot this worked very nicely
          – fred.schwartz
          Nov 22 at 16:35




          Thanks alot this worked very nicely
          – fred.schwartz
          Nov 22 at 16:35













          1














          You can use pandas.get_dummies.



          >>> males = {'fred', 'george'}
          >>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
          >>> result = pd.concat([df, fm], axis=1)
          >>>
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          This can be done much more elegantly by using a better data structure, like a dict to map names to sexes:



          >>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
          >>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          If we have to start from



          male = ['fred','george']
          female = ['alice','emily']


          you can build sex like this:



          >>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
          ...: for name in names}
          ...:
          >>> sex
          {'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}


          Finally, if the order of the columns is important, you can reindex the result.



          >>> result = result.reindex(columns=['name', 'Male', 'Female'])
          >>> result
          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer



















          • 1




            Thanks for explaining this makes a lot of sense
            – fred.schwartz
            Nov 22 at 16:35
















          1














          You can use pandas.get_dummies.



          >>> males = {'fred', 'george'}
          >>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
          >>> result = pd.concat([df, fm], axis=1)
          >>>
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          This can be done much more elegantly by using a better data structure, like a dict to map names to sexes:



          >>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
          >>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          If we have to start from



          male = ['fred','george']
          female = ['alice','emily']


          you can build sex like this:



          >>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
          ...: for name in names}
          ...:
          >>> sex
          {'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}


          Finally, if the order of the columns is important, you can reindex the result.



          >>> result = result.reindex(columns=['name', 'Male', 'Female'])
          >>> result
          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer



















          • 1




            Thanks for explaining this makes a lot of sense
            – fred.schwartz
            Nov 22 at 16:35














          1












          1








          1






          You can use pandas.get_dummies.



          >>> males = {'fred', 'george'}
          >>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
          >>> result = pd.concat([df, fm], axis=1)
          >>>
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          This can be done much more elegantly by using a better data structure, like a dict to map names to sexes:



          >>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
          >>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          If we have to start from



          male = ['fred','george']
          female = ['alice','emily']


          you can build sex like this:



          >>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
          ...: for name in names}
          ...:
          >>> sex
          {'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}


          Finally, if the order of the columns is important, you can reindex the result.



          >>> result = result.reindex(columns=['name', 'Male', 'Female'])
          >>> result
          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0





          share|improve this answer














          You can use pandas.get_dummies.



          >>> males = {'fred', 'george'}
          >>> fm = pd.get_dummies(['Male' if name.lower() in males else 'Female' for name in df['name']])
          >>> result = pd.concat([df, fm], axis=1)
          >>>
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          This can be done much more elegantly by using a better data structure, like a dict to map names to sexes:



          >>> sex = {'Fred': 'Male', 'George': 'Male', 'Alice': 'Female', 'Emily': 'Female'}
          >>> result = pd.concat([df, pd.get_dummies(df['name'].map(sex))], axis=1)
          >>> result
          name Female Male
          0 Alice 1 0
          1 Fred 0 1
          2 George 0 1


          If we have to start from



          male = ['fred','george']
          female = ['alice','emily']


          you can build sex like this:



          >>> sex = {name.capitalize():s for names, s in [(male, 'Male'), (female, 'Female')]
          ...: for name in names}
          ...:
          >>> sex
          {'Alice': 'Female', 'Emily': 'Female', 'Fred': 'Male', 'George': 'Male'}


          Finally, if the order of the columns is important, you can reindex the result.



          >>> result = result.reindex(columns=['name', 'Male', 'Female'])
          >>> result
          name Male Female
          0 Alice 0 1
          1 Fred 1 0
          2 George 1 0






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 22 at 15:18

























          answered Nov 22 at 14:58









          timgeb

          48.9k116390




          48.9k116390








          • 1




            Thanks for explaining this makes a lot of sense
            – fred.schwartz
            Nov 22 at 16:35














          • 1




            Thanks for explaining this makes a lot of sense
            – fred.schwartz
            Nov 22 at 16:35








          1




          1




          Thanks for explaining this makes a lot of sense
          – fred.schwartz
          Nov 22 at 16:35




          Thanks for explaining this makes a lot of sense
          – fred.schwartz
          Nov 22 at 16:35


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53433414%2fusing-a-list-as-a-string-of-the-name-and-the-elements-within-the-list%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          7Bj JRrjp80DNbZy6 QewlKQ5C5r 1228hbbzzzN3YGkkb wXYnKcqcW3qIcUDHHpc4ALe,o7yU,tn8U
          v9cqlNL 1m EQ2LxNScky,HbP,hGA8oJAWRCeyoR,J VNW 8x 58 2UvqdGr3GGX Bh5tW fXcmt41Shx jhkHiCeAa5jyuU91 lJzL,9

          Popular posts from this blog

          UPSERT syntax error linked to UPDATE in PostgreSQL (python)

          Some classess of my CSS file are not rendering into Django templates (most classess render without problems)

          Sphinx de Gizeh