如何从列表值替换数据帧值-python

如何从列表值替换数据帧值-python,python,pandas,dataframe,replace,Python,Pandas,Dataframe,Replace,我有一个列表和一个数据框。 f、 e: 数据帧: A B C Daisy 5 -1 Sunflower 3 5 Tulip 15 5 Orchid 8 6 Lotus 23 -1 Poppy 9 6 Lily 40 -1

我有一个列表和一个数据框。 f、 e:

数据帧:

A              B         C         
Daisy          5        -1
Sunflower      3         5
Tulip          15        5
Orchid         8         6
Lotus          23       -1
Poppy          9         6
Lily           40       -1
我想用列表1的值替换B的值,其中C>0。 所以看起来是这样的:

A              B         C        D
Daisy          5        -1        5
Sunflower      3         8        1
Tulip          15        5        4
Orchid         8         7        6
Lotus          23       -1        23
Poppy          9         6        15
Lily           40       -1        40

我使用pandas和sqlite3尝试了这段代码:

Table1 = pd.read_excel(Flowers)
Table1["id2"]=range(1, len(Table1)+1)
List1=[1, 4, 6, 15]
indexes=[]

conn = sqlite3.connect('Table1.db')
crsr = conn.cursor()
conn.commit()

Table1.to_sql('Table1', conn, if_exists='replace', index= False)


crsr.execute("SELECT id2 FROM Table1 WHERE C BETWEEN 0 and 20")
for row in crsr.fetchall():
   indexes.extend(row)


e=0

for i in indexes:

   Table1.loc[i-1,Table1.C[i-1]] = List1[e]
   if e+1>len(List1):
       break
   else:
       e=e+1
print(Table1)
得到这个结果:

           A   B     C  id2    8    5    7     6
0      Daisy   5    -1    1  NaN  NaN  NaN   NaN
1  Sunflower   3     8    2  1.0  NaN  NaN   NaN
2      Tulip  15     5    3  NaN  4.0  NaN   NaN
3     Orchid   8     7    4  NaN  NaN  6.0   NaN
4      Lotus  23    -1    5  NaN  NaN  NaN   NaN
5      Poppy   9     6    6  NaN  NaN  NaN  15.0
6       Lily  40    -1    7  NaN  NaN  NaN   NaN
如何用列表元素替换B列中的值?
谢谢你的帮助

如果列表的总长度与匹配条件下的值数量相同,则使用:

df['D'] = df['B']
df.loc[df.C > 0, 'D'] = List1
print (df)
           A   B  C   D
0      Daisy   5 -1   5
1  Sunflower   3  5   1
2      Tulip  15  5   4
3     Orchid   8  6   6
4      Lotus  23 -1  23
5      Poppy   9  6  15
6       Lily  40 -1  40
或:

如果长度与遮罩中Trues的长度不匹配,也可使用的一般解决方案:

from itertools import zip_longest

List1=[1, 4, 6,15,3]

m = df.C > 0
lens = m.sum()
df['D'] = df['B']
df.loc[m, 'D'] = [x for x, y in zip_longest(List1[:lens], range(lens), fillvalue=np.nan)]
print (df)
           A   B  C   D
0      Daisy   5 -1   5
1  Sunflower   3  5   1
2      Tulip  15  5   4
3     Orchid   8  6   6
4      Lotus  23 -1  23
5      Poppy   9  6  15
6       Lily  40 -1  40


我还认为:
df['D']=df['B'].replace(dict(zip(df.loc[df['C']>0,'B']>List1))
df.loc[df.C > 0, 'D'] = List1
df['D'] = df['D'].fillna(df['B'])
print (df)
           A   B  C     D
0      Daisy   5 -1   5.0
1  Sunflower   3  5   1.0
2      Tulip  15  5   4.0
3     Orchid   8  6   6.0
4      Lotus  23 -1  23.0
5      Poppy   9  6  15.0
6       Lily  40 -1  40.0
from itertools import zip_longest

List1=[1, 4, 6,15,3]

m = df.C > 0
lens = m.sum()
df['D'] = df['B']
df.loc[m, 'D'] = [x for x, y in zip_longest(List1[:lens], range(lens), fillvalue=np.nan)]
print (df)
           A   B  C   D
0      Daisy   5 -1   5
1  Sunflower   3  5   1
2      Tulip  15  5   4
3     Orchid   8  6   6
4      Lotus  23 -1  23
5      Poppy   9  6  15
6       Lily  40 -1  40
from itertools import zip_longest

List1=[1, 4]

m = df.C > 0
lens = m.sum()
df['D'] = df['B']
df.loc[m, 'D'] = [x for x, y in zip_longest(List1[:lens], range(lens), fillvalue=np.nan)]
print (df)
           A   B  C     D
0      Daisy   5 -1   5.0
1  Sunflower   3  5   1.0
2      Tulip  15  5   4.0
3     Orchid   8  6   NaN
4      Lotus  23 -1  23.0
5      Poppy   9  6   NaN
6       Lily  40 -1  40.0