Pandas使用技巧

删除DataFrame指定列有空值的行

  1. mydf.dropna(subset=['col1', 'col2'], inplace = True)

  2. mydf = pd.DataFrame({
                        'name' : ['Tom','Amy','John','George'],
                        'sex' : ['male','female',np.nan,'male'],
                        'number' : ['SA1001','SA1002','SA1003','SA1004'],
                        'grade' : [11, 22, 33, 44]
                    })
     mydf['sex'].isnull().value_counts()
     mydf['sex'] = mydf['sex'].fillna('999')
     pos = mydf[mydf.sex=='999'].index.tolist()
     mydf = mydf.drop(pos) # mydf.drop(pos, inplace = True)

找出DataFrame中空元素所在行

  df[df.isnull().T.any()]`

非转置:frame3.isnull().any(),得到的每一列求any()计算的结果,输出为列的Series。

删除DataFrame中某一列

1. del mydf['colume_name'] 直接修改原来的数据
2. mydf.drop('colume_name', axie = 1, inplace = True)

删除多列可以经由以下方式扩展:

1. col = ['column1', 'column2']   # 指定多个列名
   mydf.drop(labels = col, axis = 1, inplace = True)
2. mydf.drop(mydef.columns[[2,4]], axie = 1, inplace = True) # 指定多个列索引

DataFrame合并

merge

pd.merge(df_left, df_right, how = 'left/right', on = 'column_name')`:函数实现列的合并,on指向的列名必须在两个df表中都存在。

    df1 = pd.DataFrame({'name':['Tom','Amy','John','George'],
                        'sex':['male','female',np.nan,'male'],
                        'number':['SA1001','SA1002','SA1003','SA1004']})
    df2 = pd.DataFrame({'name':['Tom','Amy','John','George'],
                        'age':[18,22,25,20],
                        'grade':[77, 88, 99, 86]})
    df3 = pd.DataFrame({'name':['Tom','Amy','Jack','George'],
                        'age':[18,22,25,20],
                        'grade':[77, 88, 90, 86]})
    print(pd.merge(df1, df2, how='left', on='name'))
    # Jack 那一行被遗弃,而df1的John在df3不存在因此age和grade是NaN
    print(pd.merge(df1, df3, how='left', on='name'))  
    # John 那一行被遗弃,而df1的Jack在df3不存在因此sex和number是NaN
    print(pd.merge(df1, df3, how='right', on='name'))

concat

pd.concat([df1, df2], axis = 1),按列拼接则需要行数一致。
pd.concat([df1, df2], axis = 0, ignore_index = True), 按行拼接会使得不重名的列为NaN,ignore_index设为True使得新添df2元素的序号沿着df1本来的末尾序号递增.

append

df1.append(df2, ignore_index = True),横向添加新行

如果添加的列名不在dataframe对象中,将会被当作新的列进行添加。
因此和 pd.concat([df1, df2],axis = 0)效果一样。

DataFrame类型转换成numpy.array类型

  1. df.values --> 可以存在字符串
  2. df.as_matrix() --> 高版本已过时
  3. np.array(df)

DataFrame求某些列最小值、最大值、均值

  1. df[['col1', 'col2', 'col3']].min()、 df[['col1', 'col2', 'col3']].max()、 df[['col1', 'col2', 'col3']].mean()
  2. numpy.min(df[['col1', 'col2', 'col3']])

归一化函数

  max_min_scaler = lambda x : (x-np.min(x))/(np.max(x)-np.min(x))
  print(df.iloc[:,2:].apply(max_min_scaler))
  print(df[['chinese_grade','math_grade','english_grade']].apply(max_min_scaler)) #方法2

调整列顺序

df = pd.DataFrame({'name':['Tom','Amy','John','George'],
                'age':[18,22,25,20],
                'chinese_grade':[77, 88, 99, 86],
                'math_grade':[75,98,88,66],
                'english_grade':[67,70,59,78]})
df = df[['age', 'name', 'chinese_grade', 'math_grade', 'english_grade']]

修改index的值 : 与已存在dataframe目前长度必须匹配

df.index = range(4,0,-1) 
df.index = [4,3,2,1]
df.index = ['a', 'b', 'c', 'd'] # 可设为字符串
df.index = range(0, len(df))
df.index = range(1, len(df) + 1)
df.index = range(len(df), 0, -1)
df = df.reset_index(drop=True)  # drop=True表示删除原索引,不然会在数据表格中新生成一列'index'数据
df2 = df.set_index(keys=['name','age']) # 将原数据name, age列的数据作为索引

提取df含有指定字符串的行

行提取

mask = [False, True, False, True]
df_mask = df[mask]
print(df_mask)

完全匹配

print(df['name'] == 'Amy')
print(df[df['name'] == 'Amy'])

部分匹配

case=True不区分大小写,na=True遇到NaN也认为搜到了目标

print(df['name'].str.contains('o', case=False, na=False))
print(df[df['name'].str.contains('o')])

以特定字符串开头

df['name'].str.startswich('A')

以特定字符串结尾

df['name'].str.endswich('e')

正则表达式模式匹配

df['name'].str.match(pattern)
原文地址:https://www.cnblogs.com/Higgerw/p/14087574.html