如何从列表值替换数据帧值-python
我有一个列表和一个数据框。 f、 e: 数据帧:如何从列表值替换数据帧值-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
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