numpy 第二次运行“np.where”将覆盖第一次运行后的更改

kdfy810k  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(126)

我尝试在pandas中添加一个新列,如果在列表中找到“Level”列中的数据,则添加一些文本。然而,最后一个np.where是对第一个所做的更改的保留。我不知道如何让所有的更改都保留下来。我意识到第二个np.where只是对第一个所做的更改的保留,但不知道如何应用这两个.我尝试了一个for循环,一个if,并制作一个副本. newdf = ppl.copy(),但后来不知道如何将内容移动到副本.挖掘周围我想我可能需要ppl.loc?我肯定我错过了一些简单的东西.

import pandas as pd
import numpy as np
ppl = pd.read_excel('MyXLS.xlsx', sheet_name='People')
list8 = ['8-01','8-02','8-03','8-59']
list9 = ['9-01','9-04','9-36']
LVL8 = "These change Tuesday"
LVL9 = "These change Saturday" 

ppl['Weekday'] = np.where(ppl['Level'].isin(list8), LVL8, 'NA') 
print(ppl.head(10))
ppl['Weekday'] = np.where(ppl['Level'].isin(list9), LVL9, 'NA') 
print(ppl.head(10))

字符串
输出:

Name Level               Weekday
0    Mark  8-01  These change Tuesday
1    Gary  8-02  These change Tuesday
2    Lisa  8-03  These change Tuesday
3    John  8-59  These change Tuesday
4  Jessie  9-01                    NA
5   Chris  9-04                    NA
6     Sam  9-36                    NA
     Name Level                Weekday
0    Mark  8-01                     NA
1    Gary  8-02                     NA
2    Lisa  8-03                     NA
3    John  8-59                     NA
4  Jessie  9-01  These change Saturday
5   Chris  9-04  These change Saturday
6     Sam  9-36  These change Saturday

ahy6op9u

ahy6op9u1#

您可以嵌套np.where调用,以便第二个调用不会覆盖第一个调用所做的更改:

ppl['Weekday'] = np.where(ppl['Level'].isin(list9), LVL9, np.where(ppl['Level'].isin(list8), LVL8, 'NA'))

字符串
但是只使用.loc来寻址特定行更简单:

ppl['Weekday'] = 'NA'
ppl.loc[ppl['Level'].isin(list8), 'Weekday'] = LVL8
ppl.loc[ppl['Level'].isin(list9), 'Weekday'] = LVL9


或者np.select

ppl['Weekday'] = np.select([ ppl['Level'].isin(list8), ppl['Level'].isin(list9) ], [ LVL8, LVL9 ], 'NA')

n8ghc7c1

n8ghc7c12#

pandas.DataFrame.loc

如果你不想嵌套,最简单的方法是使用pandas.DataFrame.loc,这样你就可以通过标签(甚至是布尔数组)访问一组行和列。
使用pandas.DataFrame.loc,第二次运行不会覆盖第一次运行中所做的更改,因为您可以方便地选择单独针对特定行:)

解决方案(尽可能坚持自己的代码)

替换你的:

ppl['Weekday'] = np.where(ppl['Level'].isin(list8), LVL8, 'NA')
ppl['Weekday'] = np.where(ppl['Level'].isin(list8), LVL8, 'NA')

字符串
使用:

ppl['Weekday'] = 'NA'
ppl.loc[ppl['Level'].isin(list8), 'Weekday'] = LVL8
ppl.loc[ppl['Level'].isin(list9), 'Weekday'] = LVL9


完整代码:

import pandas as pd
import numpy as np
ppl = pd.read_excel('MyXLS.xlsx', sheet_name='People')
list8 = ['8-01','8-02','8-03','8-59']
list9 = ['9-01','9-04','9-36']
LVL8 = "These changes Tuesday"
LVL9 = "These changes Saturday"

ppl['Weekday'] = 'NA'
ppl.loc[ppl['Level'].isin(list8), 'Weekday'] = LVL8
ppl.loc[ppl['Level'].isin(list9), 'Weekday'] = LVL9


也有其他的解决方案,但不幸的是你必须嵌套。我坚持尽可能简单的代码。其他解决方案可以与Numpy和嵌套,例如使用numpy.where,它返回根据条件从x或y中选择的元素

相关问题