[英]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.