1.if-then / if-then-else用在一个数据帧上:
(原文链接:https://blog.youkuaiyun.com/tcy23456/article/details/85460709)
(可进入该博主的主页,查看更多pandas其他功能资料)
# 实例1:if-then-else
df = pd.DataFrame({'A': [10,11,12],'B': [20,21,22],'C': [30, 31, -32]})
df.loc[df.A >= 11, 'B'] = -1 #if-then在一列上(对一列进行修改值
df.loc[df.A >= 5, ['B', 'C']] = 88 #if-then分配给2列
df.loc[df.A < 12, ['B', 'C']] = 99 # 添加不同逻辑另一行,以执行-else
#df result1 result2 result3
A B C A B C A B C A B C
0 10 20 30 0 10 20 30 0 10 88 88 0 10 99 99
1 11 21 31 1 11 -1 31 1 11 88 88 1 11 99 99
2 12 22 -32 2 12 -1 -32 2 12 88 88 2 12 88 88
# 实例2:where 矢量化if else
df_bool = pd.DataFrame({'A': [True] * 3, 'B': [False] * 3, 'C': [True, False,True] })
df.where(df_bool, -66)#根据bool值选择
df['logic'] = np.where(df['A'] > 11, 'high', 'low')
#df result4 result5
A B C A B C A B C logic
0 10 99 99 0 10 -66 99 0 10 99 99 low
1 11 99 99 1 11 -66 -66 1 11 99 99 low
2 12 88 88 2 12 -66 88 2 12 88 88 high
# 实例3:
s1=pd.Series([11,np.nan,13,14,np.nan])
s2=pd.Series([np.nan,22,23,24,25])
np.where(pd.isnull(s1),s2,s1)#array([11., 22., 13., 14., 25.])
df1=pd.DataFrame({'a':[11,np.nan,13,14,np.nan],'b':[np.nan,22,23,24,25]})
df2=pd.DataFrame({'a':[np.nan,42,43,np.nan,45],'b':[31,np.nan,33,34,35]})
pd.DataFrame(np.where(pd.isnull(df1),df2,df1),columns=list('ab'))
# df1 df2 result
a b a b a b
0 11.0 NaN 0 NaN 31.0 0 11.0 31.0
1 NaN 22.0 1 42.0 NaN 1 42.0 22.0
2 13.0 23.0 2 43.0 33.0 2 13.0 23.0
3 14.0 24.0 3 NaN 34.0 3 14.0 24.0
4 NaN 25.0 4 45.0 35.0 4 45.0 25.0
============================================================
2.if-then / if-then-else用在2个数据帧上:
实例1:# 若df1>=df2选择df1中数据,否则选择df2中的数据
df1 = pd.DataFrame({'A': [10, 11], 'B': [12, 13]})
df2 = pd.DataFrame({'A': [21, -22], 'B': [23, -24]})
result1=df1[df1>=df2].append(df2[df1<df2]).dropna()
result2=df1[df1.A>df2.B]
result3=df1[df1.A!=11]
# df1 df2 result1 result2 result3
A B A B A B A B A B
0 10 12 0 21 23 0 21 23 1 11 13 0 10 12
1 11 13 1 -22 -24 1 11 13
============================================================
二,pandas的替换和部分替换(replace)
原文链接:https://www.jianshu.com/p/2557a805211f
在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错。replace()是很好的方法。
源数据
1、替换全部或者某一行
replace的基本结构是:df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
例如我们要将南岸改为城区:
将南岸改为城区
这样Python就会搜索整个DataFrame并将文档中所有的南岸替换成了城区(要注意这样的操作并没有改变文档的源数据,要改变源数据需要使用inplace = True)。
使用inplace = True更改源数据
由于南岸只有城市一列具有相同值,使用起来比较方便。
但是如果我们要改变表1Lon里的某个数据,而不改变Longitude的数据要怎么做呢?
改变指定的列的数据
所以只想替换部分数据的时候并且要写入源数据就需要指定inplace。
在上面的操作只改变了表1Lon的数据,其它列的数据并没有被替换,而且在替换后的结果不需要我们再和源数据进行合并操作,可以直接体现在源数据中。
2、替换指定的某个或指定的多个数值(用字典的形式)
只改变指定的值
这个很好理解,就是字典里的建作为原值,字典里的值作为替换的新值。
当然,我们也可是使用列表的形式进行替换:df.replace([‘A’,‘29.54’],[‘B’,100])
用列表的形式进行替换
还有如果想要替换的新值是一样的话,我们还可以这样做:
替换的新值一样时
部分替换和替换某个值结合使用的话就可以替换单个列的数值:
替换单个列的数值
3、使用正则表达式替换
正则表达式很强大,能够让我们实现一次替换很多很多个不同的值:
源数据
正则表达式没有指定regex =True
正则表达式指定regex =True
使用正则表达式的时候记得后面加 regex=True参数。
有图中我们可以看到只要包含有大写的英文字母的数据都被替换了,如果我们要写入源数据还需要指定inpla = True。
指定列替换数据
当需要将缺失值替换掉的时候,我们可以考虑直接只用fillna(),功能更强大,这个前面已经有说过了。
在某些情况下,如果我们只需要某个数据的部分内容,我们该怎么操作呢?
比如要把变电站都改为transformer_substation,或者是把Latitude列的前面的ab改为AB:
指定列更改替换部分字符
指定列更改替换部分字符
需要注意的时更好指定列的时候,使用str.replace时不能使用inplace = True参数,因此需要改成赋值,赋值的时候不要忘了是列的赋值而不是整个表格的赋值。