为简单起见,我有一个列表abc,带有abc=[a,b,c,d,e]
。
我想为数据框DF中的“文本”列分配这些值,列“ Number” = 2中具有值。我知道数据框有5个满足此条件的行,例如第1、2、3行,4 5.我想要的是row1 = a,row2 = b,row3 = c,row4 = d,row5 = e中的值 我这样写代码:
i=0
for row1 in range(0,len(df)):
if df.iloc[row1]['Number']==2:
df.set_value(df.index[row1], 'Text',abc[i])
i=i+1
但是我得到的是第1,2,3,4行中的值5获得了相同的值e。 你们能给我办法吗?非常感谢
答案 0 :(得分:1)
无需修改太多代码,我就可以使用enumerate()函数而不是您的i
循环。我正在使用Python3。
import pandas as pd
import numpy as np
# create sample dataframe
abc = ['a','b','c','d','e', 'f']
data = {'Text':['foo', 'bar', 'spam', 'eggs', 'ham', 'asdf'],
'Number':[2, 2, 5, 2, 2, 3]}
df = pd.DataFrame.from_dict(data)
df = df[['Text', 'Number']] # reordering df
print(df)
# Original question code:
# i=0
# for row1 in range(0,len(df)):
# if df.iloc[row1]['Number']==2:
# df.set_value(df.index[row1], 'Text',abc[i])
# i=i+1
# Pseudocode:
# if row value for the column 'number' is 2:
# set the value for the column 'text' at an index to the value for abc[index]
for idx, row1 in enumerate(range(0, len(df))):
if df.iloc[row1]['Number'] == 2:
df.set_value(df.index[row1], 'Text', abc[idx])
print(df)
请注意,set_value已过时,并将在以后的版本中删除。
结果:
text number
0 a 2
1 b 2
2 spam 5
3 d 2
4 e 2
5 asdf 3
FutureWarning: set_value is deprecated and will be removed in a future release. Please use .at[] or .iat[] accessors instead