使用列表作为名称和列表中元素的字符串

Posted

技术标签:

【中文标题】使用列表作为名称和列表中元素的字符串【英文标题】: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   

【问题讨论】:

【参考方案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

【讨论】:

感谢您解释这很有意义

以上是关于使用列表作为名称和列表中元素的字符串的主要内容,如果未能解决你的问题,请参考以下文章

R语言_list()函数用法

在 Python 语言中从列表元素中删除撇号

如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列

Python - 如何递归搜索作为列表元素的文本中的变量子字符串

在Python中将列表的名称作为字符串获取[重复]

Java 中类似 Python 的列表推导