【问题标题】:Using a list as a string of the name and the elements within the list使用列表作为名称和列表中元素的字符串
【发布时间】:2019-04-25 06:46:59
【问题描述】:

有没有办法制作一个列表然后循环遍历它们。

基本上我需要使用多个列表的元素作为条件,但也需要使用名称作为字符串/列名。

我知道下面的示例可以以更简单的方式完成,但我认为它需要这种方法,因为我的任务比下面的要复杂一些

 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

输出 df

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

【问题讨论】:

    标签: python string pandas list loops


    【解决方案1】:

    虽然有办法,但不推荐。只需使用字典:

    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) 起作用是因为布尔数组可以直接映射到1 / 0,就像bool 是常规Python 中int 的子类一样。

    结果:

    print(df)
    
         name  Male  Female
    0   Alice     0       1
    1    Fred     1       0
    2  George     1       0
    

    【讨论】:

      【解决方案2】:

      您可以使用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
      

      这可以通过使用更好的数据结构来更优雅地完成,例如 dict 将名称映射到性别:

      >>> 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
      

      如果我们必须从

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

      你可以像这样构建sex

      >>> 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'}
      

      最后,如果列的顺序很重要,您可以重新索引结果。

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

      【讨论】:

      • 感谢您解释这很有意义
      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多