使用列表作为名称和列表中元素的字符串
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
【讨论】:
感谢您解释这很有意义以上是关于使用列表作为名称和列表中元素的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何测试字符串包含列表中的元素并通过 Pandas 将目标元素分配给另一列