为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用for循环在pandas数据框中的现有列上创建新列

如何使用for循环在pandas数据框中的现有列上创建新列

明月笑刀无情 2021-06-27 13:40:25
我有一个两列的数据集,我想创建第三列,说明前两列的值是否相同,并为每一行命名相同的值。示例数据:import pandas as pddata = {'Colour_mix': ['1','2', '3', '4', '5', '6', '7', '8', '9', '10'],         'Colour_1': ['red', 'blue', 'red', 'red', 'green', 'green', 'green', 'red', 'blue', 'blue'],        'Colour_2': ['red', 'green', 'red', 'blue', 'green', 'red', 'green', 'red', 'green', 'blue'] }df1 = pd.DataFrame(data)cols = ['Colour_mix', 'Colour_1', 'Colour_2']df1 = df1[cols] df1我想要的结果是这样的:data2 = {'Colour_mix': ['1','2', '3', '4', '5', '6', '7', '8', '9', '10'],         'Colour_1': ['red', 'blue', 'red', 'red', 'green', 'green', 'green', 'red', 'blue', 'blue'],        'Colour_2': ['red', 'green', 'red', 'blue', 'green', 'red', 'green', 'red', 'green', 'blue'],        'Pairwise_match': ['red', 'False', 'red', 'False', 'green', 'False', 'green', 'red', 'False', 'blue']}df2 = pd.DataFrame(data2)cols2 = ['Colour_mix', 'Colour_1', 'Colour_2', 'Pairwise_match']df2 = df2[cols2] df2 即添加一个新列,它首先说明 Colour_1 和 Colour_2 列何时匹配,其次说明共享值是什么(红色、蓝色或绿色)。到目前为止,我的方法是在 Colour_1 和 Colour_2 列匹配时创建布尔数组的有序字典,然后我希望创建一个迭代循环: 1. 将布尔数组的“真”更改为匹配,即红色、蓝色或绿色,以及 2. 将结果匹配合并到一个列中。到目前为止我的代码:# Create a list of boolean arrays for each match paircolour_matches = collections.OrderedDict()colour_matches['red'] = ( (df1['Colour_1']=='red')                      & (df1['Colour_2']=='red')                      )colour_matches['blue'] = ( (df1['Colour_1']=='blue')                      & (df1['Colour_2']=='blue')                      )colour_matches['green'] = ( (df1['Colour_1']=='green')                      & (df1['Colour_2']=='green')                      )# Add pairwise match columnsfor p in colour_matches:    print(p)    _matches_df = pd.DataFrame(colour_matches[p])    _matches_df.columns = ['Pairwise_match']    df_new = pd.concat([df1, _matches_df], axis=1)我遇到的两个问题: 1. 我不知道如何更改循环中布尔数组的值,因此“True”被有条件地替换为两个颜色列(红色、蓝色或绿色)的共享值. 2. 我的循环当前会覆盖每个循环中的 Pairwise_match,因此有关先前颜色匹配(红色和蓝色)的匹配行的信息丢失,仅显示绿色。我希望最终得到三列成对匹配(即在循环的每次运行中添加/追加列),然后我可以将其合并到我想要的单个列中。非常感谢。
查看完整描述

2 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

numpy.where与布尔掩码一起使用比较两列:


df1['Pairwise_match'] = np.where(df1['Colour_1'] == df1['Colour_2'], df1['Colour_1'], False)

print (df1)

  Colour_mix Colour_1 Colour_2 Pairwise_match

0          1      red      red            red

1          2     blue    green          False

2          3      red      red            red

3          4      red     blue          False

4          5    green    green          green

5          6    green      red          False

6          7    green    green          green

7          8      red      red            red

8          9     blue    green          False

9         10     blue     blue           blue

细节:


print (df1['Colour_1'] == df1['Colour_2'])

0     True

1    False

2     True

3    False

4     True

5    False

6     True

7     True

8    False

9     True

dtype: bool


查看完整回答
反对 回复 2021-07-06
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

更简单的方法可能是:


df1["Pairwise_match"] = False

df1.loc[df1.Colour_1 == df1.Colour_2, "Pairwise_match"] = df1.Colour_1[df1.Colour_1 == df1.Colour_2]

这将创建一个充满 False 的列,然后在列之间颜色匹配的地方,用颜色值替换它们


查看完整回答
反对 回复 2021-07-06
  • 2 回答
  • 0 关注
  • 646 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号