繁体   English   中英

如何使用带条件的循环创建新列

[英]How to create new column using loop with condition

这是我的 DataFrame,我想使用带条件的循环创建一个新列。

import pandas as pd
student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
                             'name':['Kim', 'Yang', 'Park'],
                             'class':['H', 'W', 'S']})


student_card['new'] = pd.Series() #1.create new column
for i, v in student_card['name'].items(): #2.set index and values
    if "Yang" in v: #3.if there's "Yang" in value
        student_card['new'].append(v) #4. append the value of name column in new coulum

所以我尝试了这种方法并遇到以下错误:TypeError: cannot concatenate object of type '<class 'str'>'; 只有系列和 DataFrame objs 是有效的 顺便说一句,这不是真的(此列的类型是系列)

append所做的是连接一个系列,这在您的代码中不是这种情况,因为v是一个字符串, i是该字符串的索引。 您可以尝试打印print(type(v))并亲自查看。 至于文档,你可以在这里找到它: https://pandas.pydata.org/docs/reference/api/pandas.Series.append.ZFC35FDC70D5FC69D2698Z83A822C7A5E

您正在寻找的是为列上的现有索引设置一个值(或在熊猫中称为系列)。 像这样的东西:

df.loc[index] = value

所以在你的代码中,这应该可以解决问题

import pandas as pd
student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
                             'name':['Kim', 'Yang', 'Park'],
                             'class':['H', 'W', 'S']})


student_card['new'] = pd.Series() #1.create new column
for i, v in student_card['name'].items(): #2.set index and values
    if "Yang" in v: #3.if there's "Yang" in value
        student_card['new'].loc[i] = v #4. append the value of name column in new coulum

Append将连接两个系列。 你想要的是访问一行。 使用iloc 或 iat 之类的索引来执行此操作:

import pandas as pd
student_card = pd.DataFrame({'ID':[20190103, 20190222, 20190531],
                             'name':['Kim', 'Yang', 'Park'],
                             'class':['H', 'W', 'S']})


student_card['new'] = pd.Series() #1.create new column
for i, v in student_card['name'].items(): #2.set index and values
    if "Yang" in v: #3.if there's "Yang" in value
        student_card['new'].iat[i] = v #4. append the value of name column in new coulum

Output:

(指数) ID 姓名 class 新的
0 20190103 H
1 20190222 W
2 20190531 公园 小号

您真的不应该使用循环来操作 pandas dataframe,这是一种反模式。

此外,现在不推荐使用append

使用带有boolean 索引的矢量方法:

# select the rows for which name==Yang and add the same name in the new column
student_card.loc[student_card['name'].eq('Yang'), 'new'] = student_card['name']

或者,使用where

# mask all non matching values (name!=Yang) and copy the column
student_card['new'] = student_card['name'].where(student_card['name'].eq('Yang'))

output:

         ID  name class   new
0  20190103   Kim     H   NaN
1  20190222  Yang     W  Yang
2  20190531  Park     S   NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM