目录
- 读取csv文件
- 读取Excel文件
- 输出为csv文件
- 设置显示全部列
- 设置显示全部行
- 设置显示最大列数为20
- 取消链式赋值警告
- 对index重排序
- 将数据类型从Object转化为正当格式
- 行拼接DataFrame
- 列拼接DataFrame
- 基于共同列alpha的内合并(交集)
- 基于共同列alpha的外合并(并集)
- 基于共同列alpha的左合并
- 基于共同列alpha的右合并
- 基于共同列alpha和beta的内合并,其余类似
- 获取列名(list)
- 获取列名(ndarray)
- 修改列名(一次性全部修改)
- 修改列名(可以部分修改)
- 调整新列到指定位置
- 列运算:两列运算得新列
- 列运算:某一列和数值运算得新列
- 去除0值较多的列
- 用均值填充空值
- 通过.loc[]获取指定行、列的数据
- 通过.iloc[]用数字定位获取指定行、列的数据
- 根据列值条件设置列值(DataFrame)
- 基于某列值排序
- 基于某列删除重复行,保留第一次出现的行
读取csv文件
data = pd.read_csv(source)
读取Excel文件
需要先安装xlrd:pip install xlrd
# 读取程序, sheet_name=0代表Excel文件中第1张表,依次类推
source = './数据/附件一:325个样本数据.xlsx'
data_standard = pd.read_excel(source)
data1 = pd.read_excel(source1, sheet_name = 0)
data2 = pd.read_excel(source1, sheet_name = 1)
输出为csv文件
data.to_csv('data.csv',index=None,encoding="utf8")
data.to_csv("./output/data.csv",index=None,encoding="utf_8_sig")# 如果输出乱码可以试试这个
设置显示全部列
pd.set_option('display.max_columns',None)
设置显示全部行
pd.set_option('display.max_rows', None)
设置显示最大列数为20
pd.set_option('display.max_columns',20)
取消链式赋值警告
pd.options.mode.chained_assignment = None
对index重排序
data.reset_index(drop=True, inplace=True)
将数据类型从Object转化为正当格式
data = data.infer_objects()
行拼接DataFrame
df3 = pd.concat([df1,df2],axis=0)
列拼接DataFrame
pd.concat([df1,df2],axis=1)
基于共同列alpha的内合并(交集)
df3 = pd.merge(df1,df2,how='inner',on='alpha')
基于共同列alpha的外合并(并集)
df5 = pd.merge(df1,df2,how='outer',on='alpha')
基于共同列alpha的左合并
df5 = pd.merge(df1,df2,how='left',on='alpha')
基于共同列alpha的右合并
df6 = pd.merge(df1,df2,how='right',on='alpha')
基于共同列alpha和beta的内合并,其余类似
df7 = pd.merge(df1,df2,on=['alpha','beta'],how='inner')
获取列名(list)
cols = list(data) # 返回一个list
获取列名(ndarray)
cols = df1.columns.values # 返回一个ndarray
修改列名(一次性全部修改)
a.columns = ['A','B','C'] #必须写明每一列,否则会报错
修改列名(可以部分修改)
a.rename(columns={'a':'A', 'b':'B'}, inplace = True)#不一定每列都改
调整新列到指定位置
cols = list(data1To4)
cols.insert(11,cols.pop(cols.index('RON_loss')))
data1To4 = data1To4.loc[:,cols]
列运算:两列运算得新列
y_test_pred['差值'] = y_test_pred['y_test'] - y_test_pred['y_test_pred']
列运算:某一列和数值运算得新列
test_data['预测-3'] = test_data['预测'] - 3
去除0值较多的列
cols = list(data_standard_285)
search_0_285 = (data_merge_285 == 0).sum(axis=0)#axis=0表示按列相加,axis=1表示按行相加,不写表示所有行列值相加
for i in search_0_285.index:
if search_0_285[i] >= 10:
cols.pop(cols.index(i))
data_merge_285 = data_merge_285.loc[:,cols]
用均值填充空值
for column in list(data_merge_285.columns[data_merge_285.isnull().sum() > 0]):
a = data_merge_285[column].mean()
data_merge_285[column].fillna(a, inplace=True)
通过.loc[]获取指定行、列的数据
获取单个数据(类型依数据本身)
格式:
# 返回值类型依数据本身
df.loc[index,column_name]
获取单行数据(Series/DataFrame)
格式:
# 返回值为Series类型
df.loc[index]
# 返回值为DataFrame类型
df.loc[index:index]
获取单列数据(Series/DataFrame)
格式:
# 返回值为Series类型
df.loc[:,column_name]
# 返回值为DataFrame类型
df.loc[:,[column_name]]
获取多行多列的数据(DataFrame)
格式:
# 获取第start_index行到end_index行,'column_name1','column_name2',...列的数据
df.loc[start_index:end_index,['column_name1','column_name2',...]]
# 获取index1,index3,...行,'column_name1','column_name2',...列的数据
df.loc[[index1,index3,...],['column_name1','column_name2',...]]
根据列值条件获取指定数据(Series/DataFrame)
df = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
df_1 = df.loc[df['gender']=='M',:] #获取gender列值是M的全部数据
df_2 = df.loc[df['gender']=='M','name'] #获取gender列值是M,name列的数据
df_3 = df.loc[df['gender']=='M',['name']] #获取gender列值是M,name列的数据
df_4 = df.loc[df['gender']=='M',['name','age']] #获取gender列值是M,name和age列的数据
print(df_1,'\n',type(df_1),'\n',df_2,'\n',type(df_2),'\n',df_3,'\n',type(df_3),'\n',df_4,'\n',type(df_4))
name gender age
0 Snow M 22
1 Tyrion M 32
<class 'pandas.core.frame.DataFrame'>
0 Snow
1 Tyrion
Name: name, dtype: object
<class 'pandas.core.series.Series'>
name
0 Snow
1 Tyrion
<class 'pandas.core.frame.DataFrame'>
name age
0 Snow 22
1 Tyrion 32
<class 'pandas.core.frame.DataFrame'>
通过.iloc[]用数字定位获取指定行、列的数据
在column_name特别长或者index是时间序列等各种不方便输入的情况下,可以用iloc[row_index, column_index],它完全用数字来定位。
获取单个数据(类型依数据本身)
格式:
df.iloc[indexX,indexY]
获取单行数据(Series/DataFrame)
格式:
# 返回值为Series类型
df.iloc[index]
# 返回值为DataFrame类型
df.iloc[index:index+1]
获取单列数据(Series/DataFrame)
格式:
# 返回值为Series类型
df.iloc[:,index]
# 返回值为DataFrame类型
df.iloc[:,index:index+1]
获取多行多列的数据(DataFrame)
格式:
# 获取第start_index行到end_index-1行,index1,index2,...列的数据
df.iloc[start_index:end_index,[index1,index2,...]]
# 获取index1,index2,...行,第start_index行到end_index-1列的数据
df.iloc[[index1,index2,...],start_index:end_index]
df = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
df_1 = df.iloc[[1, 3], 0:1] # 获取第1行和第3行,第0列的数据
df_2 = df.iloc[1:3, [1, 2]] # 获取第1行到第2行,第1列和第2列的数据
print(df_1,'\n',type(df_1),'\n',df_2,'\n',type(df_2))
根据列值条件设置列值(DataFrame)
# 将data表中‘event_name'=‘ta_app_install'的行的‘event_time'值设置为空
data.loc[data['event_name'] == 'ta_app_install', 'event_time'] = None
基于某列值排序
# 基于'user_id'和'first_open_time'升序排序
data = data.sort_values(by=['user_id','first_open_time'])
基于某列删除重复行,保留第一次出现的行
# 按user_id删除重复行,保留第一次出现的行
data = data.drop_duplicates("user_id", keep='first')