pandas tips

1.loc和iloc:
df = pd.Dataframe(numpy.arange(16).reshape((4,4)),
  index=['first','second','third','fourth'],columns=['a','b','c','d'])

image.png

取第一、第三行:

  • 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']


image.png
  1. dataframe取差集:A-B
    先把B表append到A,再用去重函数删除(选择不保留模式),得到的结果就是两表的差集A-B:
    dfC=dfA.append(dfB).drop_duplicates(keep=False)

  2. df拼接:
    pd.cnocat([df1,df2],axis=0),0-从下方纵向增加记录;1-从右侧增加字段

  3. 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^-10

  4. groupby

  • 分组并计算
    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

你可能感兴趣的:(pandas tips)