目录
1. weekday()和reindex()的组合
2. query方法
3. eval方法
4. assign函数
5. merge函数
6. groupby函数
7. pd.to_datetime() 时间转换
8. df.dropna()
9. apply、applymap、map
10. 列删除操作
11. 更改列名的几种方法
12. 查看数据类型,转换数据类型
13. 按某一列值拆分表格
14. 填充的几种方式
15. 读取文件参数,用来改变表格中日期格式: parse_date
16. 把series转换为list
17. 输出行索引和该行的内容
18. 其它操作
datetime.weedak()方法的返回值为[0,6]之间的整数,分别代表周一到周日。在别的时区可能代表的是周日到周六。
#求出日期所在星期
sales['星期'] = sales['日期'].apply(lambda x:x.weekday()) + 1
sales = sales.reindex(columns=['日期','星期','销售额'])
#更改数据类型
sales['日'] = sales['日'].astype(str)
#转换数据类型
sales['日期'] = pd.to_datetime(sales['年月']+sales['日'], format='%Y年%m月%d')
#更改列名
sales.drop(columns=['年月','日'], inplace=True)
#对日期排序
sales.sort_values(by='日期', inplace=True)
pandas的query()方法是基于DataFrame列的计算代数式,对于按照某列的规则进行过滤的操作,可以使用query方法。
#单条件查询
df.query['A==1']
#多条件查询
df.query['A+B==1']
#引用外部变量
df.query['A+B==@x']
#其它用法
import pandas as pd
df = pd.DataFrame({'a':[1, 2, 3, 4, 5, 6],
'b':[1, 2, 3, 4, 5, 6],
'c':[1, 2, 3, 4, 5, 6]})
query_list = [1, 2]
df_2 = df.query('c not in @query_list')[['a', 'b']]
使用eval()方法的好处是可以借助列名称进行运算,也可以进行列间的算术、比较、位运算等。eval 支持接收一个inplace参数,控制原地创建新变量或者返回新的dataframe。
#新增列
df.eval('D = (A+B) / C', inplace=True)
#使用局部变量
column_mean = df.mean(1)
result = df.eval('A + @column_mean')
#支持调用函数
from math import sin
df.eval('C=sin(A)')
assign赋值新列时,一般用新列名=表达式的形式,其中新列名为变量的形式,所以不加引号(加引号时意味着是字符串)
#赋值常数列
df.assign(C=1)
#赋值已有可迭代对象
df.assign(C=[100,110])
#根据已有列赋值
df.assgin(C=df.A+df.B)
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
df.groupby(
by=None,
axis=0,
level=None,
as_index: 'bool' = True,
sort: 'bool' = True,
group_keys: 'bool' = True,
squeeze: 'bool' =
#对不同字段进行计算
.agg({'data1':'mean','data2':'sum','data3':'std'})
#对同一个字段进行多次聚合计算
#方法一:将这些函数作为列表传递
df.groupby("dummy").agg({"returns":[np.mean,np.sum]})
>>>
returns
sum mean
dummy
1 0.285 0.0285
#方法二:将这些函数作为字典传递
df.groupby('dummy').agg({'returns':{'Mean':np.mean,'Sum':np.sum}})
>>>
returns
Sum Mean
dummy
1 0.285 0.0285
def top(x,n=5):
return x.sort_values(by='tip',ascending=False)[-n:]
tips.groupby('sex').apply(top)
pandas.to_datetime(arg,errors ='raise',utc = None,format = None,unit = None )
datetime_series = pd.Series(
... pd.date_range("2000-01-01", periods=3, freq="D")
... )
>>> datetime_series
0 2000-01-01
1 2000-01-02
2 2000-01-03
dtype: datetime64[ns]
>>> datetime_series.dt.day
0 1
1 2
2 3
dtype: int64
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
subset=['A','B']根据A,B列是否为空删除数据
axis=0表示行,axis=1表示列
#axis=1,表示按行对数据进行操作
df1.apply(lambda x :x.max()-x.min(),axis=1)
0 4
1 7
2 4
df1.apply(lambda x :x.max()-x.min(),axis=0)
sales1 4
sales2 12
dtype: int64
#将时间特征进行拆分和转化
data['year']=data['Date'].apply(lambda x:x.split('-')[0])
data['year']=data['year'].astype(int)
data['IsPromoMonth']=data.apply(lambda x:0 if x['PromoInterval']==0 else 1)
df1.applymap(lambda x : 1 if x>0 else 0)
df1.sales1.map(lambda x : 1 if x>0 else 0)
删除列
del df['columns'] #改变原始数据
df.drop('columns',axis=1)#删除不改表原始数据,可以通过重新赋值的方式赋值该数据
df.drop('columns',axis=1,inplace=True) #改变原始数据
df = pd.DataFrame({'c1':[1, 2, 3], 'c2': [4, 5, 6]})
print(df)
df.columns = ['d1', 'd2']
print(df)
df.rename(columns={'d1': 'e1', 'd2': 'e2'}, inplace=True)
print(df)
df = df.rename(columns={'e1': 'f1', 'e2': 'f2'})
print(df)
-> c1 c2
0 1 4
1 2 5
2 3 6
d1 d2
0 1 4
1 2 5
2 3 6
e1 e2
0 1 4
1 2 5
2 3 6
f1 f2
0 1 4
1 2 5
2 3 6
df.dtypes#查看各列数据类型
df[A].dtypes#查看A列数据类型
df[A].astype(int)#将A列数据类型转换为int
#第一步:调用pandas包
import pandas as pd
#第二步:读入文件
iris = pd.read_excel('./iris.xlsx')
# 第三步:获取class列表并去重
class_list = list(iris['class'].drop_duplicates())
#第四步:按照类别分文件存放数据
for i in class_list:
iris1 = iris[iris['class']==i]
iris1.to_excel('./%s.xlsx'%(i))
#常数填充
df1.fillna(100,inplace=True)
#通过字典对列填充不同的常数
df1.fillna({0:10,1:20,2:30})
#填充方式为前项填充,填充个数为1,按行的前一个数进行填充
df2.fillna(method="ffill",limit=1,axis=1)
#填充方式为后项填充,填充个数为2,按列的前一个数进行填充
df2.fillna(method='bfill',limit=2,axis=0)
parse_dates=True : 尝试解析index为日期格式;
parse_dates=[0,1,2,3,4] : 尝试解析0,1,2,3,4列为时间格式;
parse_dates=[[’考试日期’,‘考试时间’]] :传入多列名,尝试将其解析并且拼接起来,parse_dates[[0,1,2]]也有同样的效果;
parse_dates={’考试安排时间’:[‘考试日期’,‘考试时间’]},将会尝试解析日期和时间拼接起来,并将列名重置为‘考试安排时间’;
Series.tolist()
df.iterrows( )函数:可以返回所有的行索引,以及该行的所有内容
for index,row in dataframe.iterrows():
print index
print row
#查看df的信息
df.describe()
#对值进行统计
df.value_counts()
#将nan替换为指定的数
df = df.fillna(value_to_replace_null)
#根据某列去重计数
df.drop_duplicates('列名').count()
#将某列设置索引
data.set_index('序号',inplace=True)
#将索引设置为列
data['销售员'] = data.index
#空值统计
df.isnull.sum()
#导入数据集,将时间格式变为字符串类型
train=pd.read_csv(r'E:\python\data\train.csv',dtype={'StateHoliday':pd.np.string_})
#删除指定值所在的行
data = data.drop(index = data[(data.ZH_Term_len == 0)].index.tolist())