我有一个包含不同颜色的列表,所有颜色都存储为字符串变量。
Preferredcolours = ['red','yellow','green', 'blue']
我有一个熊猫数组,其中包含有关汽车的信息。 DfCar ['colour']列之一是这些汽车的颜色。我想在数据框中创建一个名为PreferredMathcing的新变量,如果DataFrame颜色列与列表颜色之一匹配,则该列为= 1。如何使用for循环解决此问题?
理想情况下,我想要这种解决方案:
+=================+============================+
| DfCar['colour'] | DfCar['PreferredMathcing'] |
+=================+============================+
| white | 0 |
+-----------------+----------------------------+
| yellow | 1 |
+-----------------+----------------------------+
| black | 0 |
+-----------------+----------------------------+
| purple | 0 |
+-----------------+----------------------------+
| green | 1 |
+-----------------+----------------------------+
答案 0 :(得分:1)
您可以使用.isin(),这会根据行是否在值列表中而返回每行True
/ False
的序列。然后使用.astype(int)
来获取您的1
/ 0
。
尝试一下:
import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict({'colour': ['white', 'yellow', 'black', 'purple', 'green']})
Preferredcolours = ['red','yellow','green', 'blue']
df["PreferredMathcing"] = df['colour'].isin(Preferredcolours).astype(int)
print(df)
输出:
colour PreferredMathcing
0 white 0
1 yellow 1
2 black 0
3 purple 0
4 green 1
注意:
选择具有纯库函数的解决方案可能会胜过使用apply
和自定义python逻辑的解决方案。
在我的计算机上对彼此进行基准测试表明.isin()
快了将近x8:
with '.isin()': 1.0591506958007812
with '.apply()': 8.234664678573608
ratio: 7.774780974248154
答案 1 :(得分:1)
以下将为您提供输出
def check_colour(x, Preferredcolours) :
return 1 if x['colour'] in Preferredcolours else 0
dfCar['PreferredMathcing'] = df.apply(check_colour,args=(Preferredcolours,), axis=1)
答案 2 :(得分:0)
您可以使用np.where,如下所示:
import pandas as pd
import numpy as np
DfCar = pd.DataFrame.from_dict({'colour': ['white', 'yellow', 'black', 'purple', 'green']})
Preferredcolours = ['red','yellow','green', 'blue']
DfCar['PreferredMathcing'] = np.where(DfCar['colour'].isin(Preferredcolours), 1, 0)
答案 3 :(得分:0)
假设DfCar
是您的数据框。
Preferredcolours = ['red','yellow','green', 'blue']
DfCar['PreferredMatching'] = DfCar['colour'].apply(lambda x: x in Preferredcolours)
这会将lambda函数应用于“颜色”列中的每个元素。只需检查它是否为“ preferredcolours”,然后返回True或False。