1.loc和iloc:
df = pd.Dataframe(numpy.arange(16).reshape((4,4)),
index=['first','second','third','fourth'],columns=['a','b','c','d'])
取第一、第三行:
- loc取index的具体值,可以是df.loc[0,2] (未设置index时)也可以是df.loc['test1','third'];
- iloc为行号(从0开始)而非index值,只接受integer,df.iloc[0,2]
切片写法取前几行:
loc[0:2]、loc[:2]、loc['first':'third']都是取前三行,iloc[0:2]、iloc[:2]取前两行
取第二列:df.loc[:,['b']],df.iloc[:,[1]]
取前三行、前两列:df.loc['first':'third',['a','b']],df.iloc[:3,:2]
筛选a列大于4的行的c列值:df.loc[df['a']>4,'c']
dataframe取差集:A-B
先把B表append到A,再用去重函数删除(选择不保留模式),得到的结果就是两表的差集A-B:
dfC=dfA.append(dfB).drop_duplicates(keep=False)df拼接:
pd.cnocat([df1,df2],axis=0),0-从下方纵向增加记录;1-从右侧增加字段datacompy的abs_tol和rel_tol
datacompy.Compare(..., ans_tol=0.5)表示abs(a-b)小于0.5;
datacompy.Compare(..., rel_tol=1e-10)表示abs(a / b - 1)小于10^-10groupby
- 分组并计算
df2 = df1.groupby(key, as_index=False).agg({'test1': ['mean'], 'test2': ['sum']})
注意:数据列内如果存在不同类型数据无法sum,该列会被丢弃,因此groupby之前最好fillna。 - 分组并count另一列distinct数
df2 = df1.groupby(['test1', 'test2'],as_index=False)['test3'].nunique()
6.条件判断
- 筛选某些列值后,设置指定列值:
df.loc[(df['test1'] < a) & (df['test2'] == 'b'), ['test2']] = 0 - query查询
status= 'Success'
df1 = df.query('(score == 99) and (result== @status)') - 获取某列值不在某列表的数据:
df=df.loc[~df['test1'].isin(listA)]
7.批量rename
第2列之后的所有列名,添加前缀
new_name = [(name, 'pre_' + name) for name in df.iloc[:, 2:].columns.values]
df.rename(column=dict(new_name), inplace=True)
8.判断值不等的ne方法
df.ne(other, anxis='columns', level=None)
df1 = pd.Dataframe({"A":[14,4,5,4,1], "B":[5,2,54,3,2], "C":[20,20,7,3,8], "D":[14,3,6,2,6]})
ser = pd.Series([3, 2, 4, 5, 6])
df1.ne(ser, axis=0) 表示df1的ABCD每一列都跟ser比较,相等的为False不等的为True,
以此为结果输出结构和df1相同的df,值全为True、False
9.查找最后一个非0数据的index
idx = (df.shape[0] - df.ne(0).values[::-1].argmax(0)).tolist()[-1] - 1