按顺序从列表中为datafame中的多行分配多个值

时间:2018-06-26 21:08:16

标签: python list pandas dataframe

为简单起见,我有一个列表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。 你们能给我办法吗?非常感谢

1 个答案:

答案 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