一、is和==的区别:
is 判断两个变量是否是引用同一个内存地址。 所以判断是否数据为Nonetype的时候可以直接使用判断 if XXX is None: print()
== 判断两个变量是否相等。
如果不用 a = b 赋值,int 型时,在数值为 -5~256(64位系统)时,两个变量引用的是同一个内存地址,其他的数值就不是同一个内存地址了。
二、pandas填充数据 fillna
1.填充Nonetype
df_train['keyword'].replace(to_replace=[None],value='None',inplace=True)
填充nan:
2.常数:没用inplace,所以要重新赋值
all_data['Cabin'] = all_data['Cabin'].fillna('Unknown')
3.字典列填充:
all_data['Cabin'] = all_data['Cabin'].fillna({0:10,1:20,2:30})
4.指定inplace
指定inplace=true才会修改你所要操作的dataframe
5.method = 'ffill'/'pad':用前一个非缺失值去填充该缺失值、
#1.method = 'ffill'/'pad':用前一个非缺失值去填充该缺失值
df2.fillna(method='ffill')
6.method = 'bflii'/'backfill':用下一个非缺失值填充该缺失值
#2.method = 'bflii'/'backfill':用下一个非缺失值填充该缺失值
df2.fillna(method='bfill')
7.指定limit 填充2个
df2.fillna(method='bfill', limit=2)
8.指定axis,axis=1为按行操作
df2.fillna(method="ffill", limit=1, axis=1)
填充部分致谢:https://blog.csdn.net/weixin_39549734/article/details/81221276
三、pandas数据替换 replace
1.df.replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
df_train['keyword'].replace(to_replace=[None],value='None',inplace=True)
2.对某一列特定值进行替换
result['prediction'].replace([0,1,2,3,4,5,6,7,8],[870,870,880,898,1300,13117,13298,13690,13691],inplace=True)
*注意:不指定列就会对所有列进行操作,不指定inplace不会修改原dataframe
四、pandas loc
1.check data
>>> data = {'amount': [100, 200, 300, 400, 500],
... 'name': ['', '商品1', '商品3', '', '商品3']}
>>> df = pd.DataFrame(data)
>>> df
amount name
0 100
1 200 商品1
2 300 商品3
3 400
4 500 商品3
>>> df.loc[0][1]
''
>>> df.loc[0][0]
100
2.利用loc定位赋值的方法见下面:
五、pandas 新增一列 并且赋值
注意列名用中括号和用 .列名的区别,个人感受:
如果列名里面有空格或者数字就不要用点了,用点比较省事~
致谢:Pandas新增一列并按条件赋值? - 知乎 (zhihu.com)
方法1:利用lamba 注意:x.name 有特殊含义,不要定义为name,以下只为表达意思,修改一下df.rename(columns={'name':'list','amount':'AAA'},inplace=True)
df['x1'] = df.apply(lambda x: x.amount if x.name != "" else 0, axis=1)
方法2:
df['x2'] = np.where(df['name'] == '', 0, df['amount'])
方法3:
df['x4'] = df['amount']
df.loc[df['name'] == '', 'x4'] = 0
按照指定值利用loc进行赋值:
先用age定位到age是空置的地方,赋值列age为你预测的值
all_data.loc[(all_data.Age.isnull()),'Age']=predictedAges
方法1-3详细代码:
import pandas as pd
import numpy as np
if __name__ == '__main__':
data = {'amount': [100, 200, 300, 400, 500],
'name': ['', '商品1', '商品3', '', '商品3']}
df = pd.DataFrame(data)
# 杨航锋的方法
df['x1'] = df.apply(lambda x: x.amount if x.name != "" else 0, axis=1)
# 张翼轸的方法
df['x2'] = np.where(df['name'] == '', 0, df['amount'])
df['x3'] = df['amount'].where(df['name'] != '', 0)
df['x4'] = df['amount']
df.loc[df['name'] == '', 'x4'] = 0
def multiple_columns(row):
out = {}
out['double_amount'] = row['amount'] * 2
out['empty_name'] = not row['name']
return pd.Series(out)
df[['double_amount', 'empty_name']] = df.apply(multiple_columns, axis=1)
print(df)
六、根据条件选取列
1.直接写在[]里面
fare = all_data[(all_data['Embarked'] == "S") & (all_data['Pclass'] == 3)].Fare.median()
2.利用loc,效果和上面一样
b=df.loc[df['AAA']>300]
如果取某些列就在后面加上[]或者.列名
3.选取某列是否属于某个列表的数值之一 用 isin
df.loc[df[‘column_name’].isin(some_values)]
4.多种条件的选取 用 &
df.loc[(df[‘column’] == some_value) & df[‘other_column’].isin(some_values)]
5.选取不等于某些值的行记录 用 !=
df.loc[df[‘column_name’] != some_value]
6.isin返回一系列的数值,如果要选择不符合这个条件的数值使用~
df.loc[~df[‘column_name’].isin(some_values)]
此部分致谢:https://blog.csdn.net/changzoe/article/details/82348913
七、生成dataframe
1.numpy 生成矩阵转成dataframe
>>> df2 = pd.DataFrame(np.random.randint(0,10,(5,5)))
>>> df2
0 1 2 3 4
0 8 7 9 6 6
1 9 7 7 7 2
2 3 4 7 4 6
3 0 5 8 1 7
4 5 3 3 6 6
>>> np.random.randint(0,10,(5,5))
array([[8, 7, 6, 3, 1],
[9, 4, 9, 4, 1],
[4, 2, 7, 2, 7],
[0, 6, 6, 7, 1],
[1, 4, 8, 5, 0]])
2.指定行列生成
>>> dates = np.arange(20190809,20190815)
>>> df1 = pd.DataFrame(np.arange(24).reshape(6,4),index=dates,columns=["A","B","C","D"])
>>> df1
A B C D
20190809 0 1 2 3
20190810 4 5 6 7
20190811 8 9 10 11
20190812 12 13 14 15
20190813 16 17 18 19
20190814 20 21 22 23
八、最常用的几个命令
致谢:Python之NumPy(axis=0 与axis=1)区分 - caiqingfei - 博客园 (cnblogs.com)
pandas速查手册(中文版) - 布尔先生 - 博客园 (cnblogs.com)