dataframe小技巧

一.基本操作篇

1.新建
自己定义column_name:

import pandas as pd
df = pd.DataFrame(columns=['col1','col2', 'col3', 'col4'])

延用之前的column_name:

df = pd.DataFrame(columns=list(article_df))csc

将一个list的值赋给某列:

df['B'] = listB

2.统计

  1. 统计某列某值的个数:
#mydf: dataframe
#mydf['mycolumnname']: mydf中的名为mycolumnname的一列
list(mydf['mycolumnname']).count("xxx") # 其中xxx为想统计的值
  1. 统计某列的值的枚举
df['column_name'].unique()

3.筛选
参考链接

根据值筛选:
之一:

newdf = df[(df.origin == "JFK") & (df.carrier == "B6")]

之二:

content='672844410'
x=df[df['column_name']==content]

之三:

df.query('code=="000002.SZ"')

多条件:

# 多条件
df.query('code=="000002.SZ" | code=="000006.SZ"')

多条件参考2,输入为list:

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

参考链接

多条件筛选3,包括not in:
参考链接

根据列名筛选:

df['column_name']

看两列:

article_df[['column_name1','column_name2']]

根据行数/列数筛选(iloc):

df.iloc[:5,] #First 5 rows
df.iloc[1:5,] #Second to Fifth row
df.iloc[5,0] #Sixth row and 1st column
df.iloc[1:5,0] #Second to Fifth row, first column
df.iloc[1:5,:5] #Second to Fifth row, first 5 columns
df.iloc[2:7,1:3] #Third to Seventh row, 2nd and 3rd column

看某几列:
1.按多少列

df.iloc[:,[0,1]]

2.按列名

df.loc[:,('列名','列名')]

根据hash_map筛选:

wrong_list = []
map = {'a': 1, 'b': 3, 'c': 7,'d':-1}
for index, row in article_df.iterrows():
    aging=row['key']
    if key is not None and key in map:
        value= map[key]
        if value!=-1:
            if row['key']!=value:
                   wrong_list.append(row['key'])

4.遍历行数
参考链接

5.取列名

1.[column for column in df] 
2.df.columns.values 返回 array 
3.list(df) 
4.df.columns 返回Index,可以通过 tolist(), 或者 list(array) 转换为list

6.df与常用类型转化
df ->list:

   list = df.values.tolist()

参考链接
list->df:

df=pd.DataFrame(list)

df->array:

 x=df.values

两个array合并:

np.hstack((mm.values,nn.values))

将array转化为DataFrame:

pd.DataFrame(np.hstack((mm.values,nn.values)))

7.设置列名

df.columns=['col1']

8.拼接
纯拼接,不考虑id是否相同,用concat,列拼接,axis=1;行拼接,axis=0(默认)
cancot,merge参考链接
一行一行拼接:

df1 = df1.append(df.iloc[0], ignore_index=True)

merge:列拼接

 data = pandas.merge(u_data, u_item, on="movie_id", how='left')
 data = pandas.merge(data, u_user, on="user_id", how='left')

9.df转csv

df.to_csv ("testfoo.csv" , encoding = "utf-8")

10.筛选 isin

import pandas as pd
 
df = pd.read_excel('分类标准-新.xlsx')
 
#list0=[7662,7667,7672,7677,7682,7688,7693,7698,7704,7662,7709,7714,7719,7725,7730,7735,7741,7709,7746,7751,7756,7762,7767,7772,7778,7746,7783,7783]
list0=[7664,7669,7674,7679,7684,7690,7695,7700,7706,7664,7711,7716,7721,7727,7732,7737,7743,7711,7748,7753,7758,7764,7769,7774,7780,7748,5047,5047]
a = df[(df['元素编码'].isin(list0))].index.tolist()
 
result=[]
for x in list0:
 
    a = df[(df['元素编码']==x)].index.tolist()
    print (a[0])
    result.append(a[0])
 
 
df.ix[result]['章节/元素名称'].tolist()
df.ix[result]['元素名'].tolist()
 
 
----
#is_in
 
a = df[(df['元素编码'].isin(list0))].index.tolist()

筛选过滤参考链接

11.删除

df=df.drop(['hello'],axis=1)

删除某列
删除
删除某行

# 删除索引为1的行
dftest = df.drop(1, axis=0)
dftest

删除

df.keys()
 
del df[df.keys()[0]]
df.keys()

12.检查是否有空/none/nan

df.isnull().values.any()
"""
返回值:true为有空;false为无空
“”“

检测非None数量:

df.info(verbose=True, null_counts=True)

上述方法:''检测不出来

df = df[df[fea]=='']

显示有空列的行,太给力了(可以过滤掉dropna之后的漏网之鱼)a

print(frame3[frame3.isnull().T.any()])

13.去除空/none/nan
参考链接
方法1:
删去行:

'''
dropna()方法会删除所有包含NaN值得行,然后返回删除后的数据。
dropna(how = 'all')则删除全部为空值的行,或者检测某列
'''

df.dropna()
df.dropna(how = 'all')
df_filter = df_filter.dropna(subset=["x1","x2"])

方法2:
填充:
有多种填充方法:如填充中位数等,后续补充

# 将NaN值全部转换为0
df.fillna(0)

'''
单列缺失值替换
将df表中年龄列的NaN值全部转化为0
'''
df.fillna({"年龄":0})

'''
多列缺失值替换
将df表中年龄、成绩列的NaN值全部替换成0
'''
df.fillna({"年龄":0,"成绩":0})
'''
某列用均值填充
'''
data['a1']=data['a1'].fillna(data['a1'].mean())
'''
全部用均值填充
'''
data=data.fillna(data.mean())
'''
用每列特征的中位数填充
'''
data.fillna(data.median())
'''
用相邻后面(back)特征填充前面缺失值
'''
data.fillna(method='bfill')

更多填充方式
14.切割
将一个dataframe分为几份

result = np.array_split(df,3)

其中result为list

二.数据分析

1.对于整体数据粗看一下:

df_data_brand.describe() 

粗看某列每个元素数量:

df['元素编码'].value_counts()

细看某列每个元素数量(转为dict):

list1 = df3["Alarm_Z"].values.tolist()
dict(zip(*np.unique(lst, return_counts=True)))

画图:

x1= dict1.keys()
y1=dict1.values()
plt.plot(x1,y1,label="xxx")

字典画图超详细参考链接

看df每列的类型:

df.dtypes

df维度信息:

df.info()

看某列的每个值的个数
一些分别看到函数
参考链接
2.常用数据处理函数
1.agg聚合函数

pd['Math'].agg(lambda x:x.max()-x.min())
pd.agg({'Math':['mean','max'],'Height': 'var'})
pd.agg(['mean','max','min'])

2.group by
参考链接

df=df.groupby(by='time').mean()#按time分组,对于time相同的几条数据保留其均值
df=df.reset_index('time')#此时time为索引,因此要将索引恢复为列,并重置索引

参考链接

算某个特征的值相同的时候,对于其他特征归一化:
最大最小归一化:

df['unify_fea'] = df.groupby(by=['fea1'])['fea2'].apply(lambda x: (x-x.min())/ (x.max() - x.min()))

必须group by,否则会报错;
均值方差归一化:
分位数归一化:
参考链接

    for reviewerID, hist in tqdm(data.groupby('user_id')):
        pos_list = hist['movie_id'].tolist()
        genres_list = hist['genres'].tolist()
        rating_list = hist['rating'].tolist()

根据某一个feature groupby
3.排序

df.sort_values(['class','score'],ascending=[1,0],inplace=True)
ascending=0为逆序

4.求很多数组元素的并集,统计出现在数组中的独立元素
做法1:

a_list = [1, 2, 3, 4, 5]
b_list = [1, 4, 5]
ret_list = list(set(a_list).union(set(b_list)))

做法2:

    all_sku_set=set()
    for item in all_match_list:
        all_sku_set.update(set(item))

4.筛选包含
单个筛选:

df[df['地址'].str.contains('北京')]

多个筛选(或):

citys = ['北京', '天津', '上海']
address = '|'.join(citys)
df_new = df[df['地址'].str.contains(address)]

参考链接
5.函数apply用法
增加一列:
方法1:

df["hello"] = df['item'].apply(lambda x:deal_name(x))

方法2:

df['cate'] = df.apply(lambda row:deal_name(str(df['item']),cate_items,row), axis=1)

重新标注:

df_third_cate_analysis1=df_third_cate_analysis1.reset_index(drop=True)

6.去掉百分号+修改一列

python
df_third_cate_analysis1['A2B']=df_third_cate_analysis1['A2B'].apply(lambda x:float(x.strip('%')))

7.dataframe转字典

d = df.set_index('A')['B'].to_dict()

参考链接
8.数据转型:

df.index.astype('int64') # 索引类型转换
 
df=df.astype('int64') # 所有数据转换为 int64
 
df=df.astype('int64', copy=False) # 不与原数据关联
 
td_link_data=td_link_data.astype({'管理域': 'int32'}) # 指定字段转指定类型
 
td_link_data=td_link_data['管理域'].astype('float')   #某一列转换
 
td_link_data=td_link_data['链路ID'].astype('object') #某一列转换

astype参考链接

9.df 的所有列都从int转为str:

df=df.applymap(str)

10.单列去重

df.drop_duplicates(['a'],keep='first',inplace=True)

参考链接

方法2:

df_filted['shop_id'].unique().tolist()

11.df建一个新的列
参考链接

12.pandas读取大批量数据报错情况,处理方法:

file_reader = pd.read_table(input_file_path,sep='\t', header=None, skiprows=1,quoting=csv.QUOTE_NONE,error_bad_lines=False) 

有时因为内存不够,无法一次性读取
13.分列
参考链接
函数描述

A=[1,2,3]
df.explode('A')

如果是str,可以先用map将其转化为list,然后进行explode

df["Genre"] = df["Genres"].map(lambda x:x.split("|"))
df_new = df.explode("Genre")

14.某一行最大值

df.idxmax(axis = 1, skipna = True)

转型后查找

df.astype('float').idxmax(axis = 1, skipna = True)

15.新建索引
把某一列特征作为索引

df.set_index("Animal", inplace=True)

16.找某个特征是第几列

df.columns.get_loc('feature')
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值