Pandas数据处理常用操作(更新中)

1.查看数据相关信息

df.info() #查看数据类型
df.shape #查看数据规模
df.describe() #数据统计信息描述

2.如何设置才能不隐藏DataFram的列?

pd.set_option("max_columns",100) #这里100可以调整:最大显示列数
pd.set_option('display.max_columns',None) #这种是都显示

3.如何将序列的索引转换成数据帧的列?

import numpy as np
import pandas as pd
mylist=list('abcdefghijklmnopqrstuvwxyz')
myarr=np.arange(26)
mydict=dict(zip(mylist,myarr))
ser=pd.Series(mydict)
df=ser.to_frame().reset_index()
df

4.怎样将两个Series组合成一个DateFrame

ser1=pd.Series(list('abcdefghijklmnopqrstuvwxyz'))
ser2=pd.Series(np.arange(26))
#solution1
df=pd.DataFrame({'col1':ser1,'col2':ser2})
#solution2
df=pd.concat([ser1,ser2],axis=1)
df.head()

在这里插入图片描述
5.如何给系列的索引命名

ser = pd.Series(list('abcedfghijklmnopqrstuvwxyz'))
ser.names='alphabets'
ser.head()

在这里插入图片描述
6.怎样得到系列A中的数据不包含序列B的数据

ser1=pd.Series([1,2,3,4,5])
ser2=pd.Series([4,5,6,7,8])
ser1[~ser1.isin(ser2)]

在这里插入图片描述
7.怎样找到序列A与序列B中的不同元素元素?

ser1 = pd.Series([1, 2, 3, 4, 5])
ser2 = pd.Series([4, 5, 6, 7, 8])
seru=pd.Series(np.union1d(ser1,ser2))#留下一个相同元素并合并
seri=pd.Series(np.intersect1d(ser1,ser2))#找到相同元素
seru[~seru.isin(seri)]
seru.head()

在这里插入图片描述
8.如何得到一个数字序列的最小值、第25个百分点、中间值、第75个百分点和最大值?

state=np.random.RandomState(100)#使用RandomState获得随机数生成器,100为随机种子
ser=pd.Series(state.normal(10,5,25))
np.percentile(ser,q=[0,25,50,75,100])##求取ser序列第0%、25%....分位的数值

9.如何获得系列中唯一项目的频率计数?

ser = pd.Series(np.take(list('abcdefgh'), np.random.randint(8, size=30)))
ser.value_counts()

在这里插入图片描述
10.如何只保留前两个最常见的值,而将其他所有值替换为“Other”?

np.random.RandomState(100)
ser = pd.Series(np.random.randint(1, 5, [12]))#产生[1,5)的12个随机序列
print("Top 2 Freq:", ser.value_counts())#对Series里面的每个值进行计数并且排序。
ser[~ser.isin(ser.value_counts().index[:2])]='Other'
ser

在这里插入图片描述
11.如何将numpy数组转换为给定形状的数据帧?

import pandas as pd
import numpy as np
ser=pd.Series(np.random.randint(1,10,35))
df=pd.DataFrame(ser.values.reshape(7,5))
df

在这里插入图片描述
12.如何从数列中找出3的倍数的数字位置?

ser=pd.Series(np.random.randint(1,10,7))
#np.argwhere( a ) 
#返回非0的数组元组的索引,其中a是要索引数组的条件。
np.argwhere(ser % 3==0)

在这里插入图片描述
13.如何从序列中提取给定位置的内容?

ser = pd.Series(list('abcdefghijklmnopqrstuvwxyz'))
pos = [0, 4, 8, 14, 20]
ser.take(pos)

在这里插入图片描述
14.如何垂直和水平堆叠两个系列?

ser1 = pd.Series(range(5))
ser2 = pd.Series(list('abcde'))
# Vertical
ser1.append(ser2)

# Horizontal
df = pd.concat([ser1, ser2], axis=1)

15.如何在另一个系列B中获得系列A项目的位置?

ser1 = pd.Series([10, 9, 6, 5, 3, 1, 12, 8, 13])
ser2 = pd.Series([1, 3, 10, 13])
#np.where()返回满足条件的索引
#np.where(x>=5)[0] 输出的类型是一个元组,元组的第一个元素是list
#tolist将序列转为列表
#1. np.where(condition, x, y)
#满足条件(condition),输出x,不满足输出y。

# Solution 1
[np.where(i == ser1)[0].tolist()[0] for i in ser2]
# Solution 2
[pd.Index(ser1).get_loc(i) for i in ser2]

16.如何将序列中每个元素的第一个字符转换为大写?

ser = pd.Series(['how', 'to', 'kick', 'ass?'])
# Solution 1
ser.map(lambda x: x.title())

# Solution 2
ser.map(lambda x: x[0].upper() + x[1:])

# Solution 3
pd.Series([i.title() for i in ser])

17.如何计算一个序列中每个单词的字符数?

ser = pd.Series(['how', 'to', 'kick', 'ass?'])
ser.map(lambda x: len(x))

18.如何计算一系列连续数之间的差值?

ser = pd.Series([1, 3, 6, 10, 15, 21, 27, 35])
#output
#[nan, 2.0, 3.0, 4.0, 5.0, 6.0, 6.0, 8.0]
#[nan, nan, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0]
print(ser.diff().tolist())
print(ser.diff().diff().tolist())

在这里插入图片描述
19.如何将一系列日期字符串转换成时间序列?

ser = pd.Series(['01 Jan 2010', '02-02-2011', '20120303', '2013/04/04', '2014-05-05', '2015-06-06T12:20'])
#sulution1
pd.to_datetime(ser)
#sulution2
from dateutil.parser import parse
ser.map(lambda x: parse(x))

在这里插入图片描述
20.如何从一系列日期字符串中获取月中的哪一天、周数、年中的哪一天和周中的哪一天?

ser = pd.Series(['01 Jan 2010', '02-02-2011', '20120303',
                 '2013/04/04', '2014-05-05', 
                 '2015-06-06T12:20'])
ser=pd.to_datetime(ser)
# day of month
ser.dt.day.tolist()
#week number
ser.dt.weekofyear.tolist()
#day of year
ser.dt.dayofyear.tolist()
#day of week
ser.dt.weekday_name.tolist()

在这里插入图片描述21.如何将年-月字符串转换为对应于一个月第四天的日期?

ser = pd.Series(['Jan 2010', 'Feb 2011', 'Mar 2012'])
#output
#0   2010-01-04
#1   2011-02-04
#2   2012-03-04
ser=pd.to_datetime(ser)
ser

在这里插入图片描述
22.如何找到数字序列中的所有局部最大值(或峰值)?

ser = pd.Series([2, 10, 3, 4, 9, 10, 2, 7, 3])
#[-2  2  0  0 -2  2 -2]
dd = np.diff(np.sign(np.diff(ser)))
#np.diff(ser)
#[ 8 -7  1  5  1 -8  5 -4]
#np.sign(np.diff)  
#[ 1 -1  1  1  1 -1  1 -1]
peak_locs = np.where(dd == -2)[0] + 1
peak_locs

在这里插入图片描述
23.如何用最不频繁的字符替换字符串中丢失的空格?

my_str = 'dbc deb abed gade'
ser = pd.Series(list('dbc deb abed gade'))
#'dbccdebcabedcgade'  # least frequent is 'c'
freq = ser.value_counts()
least_freq = freq.dropna().index[-1] #找到最少频率的字母
"".join(ser.replace(' ', least_freq))

在这里插入图片描述
24.如何填充间歇时间序列,以便所有缺失的日期都显示以前未缺失的日期的值

ser = pd.Series([1,10,3,np.nan], index=pd.to_datetime(
    ['2000-01-01', '2000-01-03', '2000-01-06', '2000-01-08']))
print(ser)
#> 2000-01-01     1.0
#> 2000-01-03    10.0
#> 2000-01-06     3.0
#> 2000-01-08     NaN
#> dtype: float64
# Input
ser = pd.Series([1,10,3, np.nan], index=pd.to_datetime(
['2000-01-01', '2000-01-03', '2000-01-06', '2000-01-08']))

# Solution
ser.resample('D').ffill()  # fill with previous value

# Alternatives
ser.resample('D').bfill()  
# fill with next value
ser.resample('D').bfill().ffill() 
# fill next else prev value

25.如何创建一个数据帧,其中的行是从给定系列开始的步幅?

L = pd.Series(range(15))
def gen_strides(a, stride_len=5, window_len=5):
    n_strides = ((a.size-window_len)//stride_len) + 1
    return np.array([a[s:(s+window_len)] for 
        s in np.arange(0, a.size, stride_len)[:n_strides]])

gen_strides(L, stride_len=2, window_len=4)

在这里插入图片描述
26.如何用平均值替换多个数值列的缺失值?

df_out = df[['Min.Price', 'Max.Price']] = df[['Min.Price', 'Max.Price']].apply(lambda x: x.fillna(x.mean()))

27.如何更改数据帧的列顺序?

df = pd.DataFrame(np.arange(20).reshape(-1, 5), columns=list('abcde'))
df[list('cbade')]

在这里插入图片描述
28.如何将数据帧中的所有值格式化为百分比?

# Input
df = pd.DataFrame(np.random.random(4), columns=['random'])

# Solution
out = df.style.format({
    'random': '{0:.2%}'.format,
})

out

在这里插入图片描述
29.如何交换两行数据

# Input
df = pd.DataFrame(np.arange(25).reshape(5, -1))

# Solution
def swap_rows(df, i1, i2):
    a, b = df.iloc[i1, :].copy(), df.iloc[i2, :].copy()
    df.iloc[i1, :], df.iloc[i2, :] = b, a
    return df

print(swap_rows(df, 1, 2))

在这里插入图片描述
30.如何将数据转置?

# Input
df = pd.DataFrame(np.arange(25).reshape(5, -1))
# Solution 1
df.iloc[::-1, :]
# Solution 2
print(df.loc[df.index[::-1], :])

在这里插入图片描述
31.如何创建分类变量(虚拟变量)的一次性编码?

# Input
df = pd.DataFrame(np.arange(25).reshape(5,-1), columns=list('abcde'))

# Solution
df_onehot = pd.concat([pd.get_dummies(df['a']), df[list('bcde')]], axis=1)
print(df_onehot)

在这里插入图片描述
32.如何将一个文本列分成两个独立的列?

# Input
df = pd.DataFrame(["STD, City    State",
"33, Kolkata    West Bengal",
"44, Chennai    Tamil Nadu",
"40, Hyderabad    Telengana",
"80, Bangalore    Karnataka"], columns=['row'])
print(df)
print('================================================')
# Solution
df_out = df.row.str.split(',|\t', expand=True)

# Make first row as header
new_header = df_out.iloc[0]
df_out = df_out[1:]
df_out.columns = new_header
print(df_out)

在这里插入图片描述33.统计空值?

df.isnull().sum()

34.查看是否有重复值?

df.duplicated().any()

35.填充空值?
更多关于空值填充的可以看数据分析三剑客之pandas(八)

df.fillna(method = "ffill") #这是前向方法填充,bfill为后向填充
df.fillna(0) #用0填充空值

36.删除列?
更多相关内容同上

df.drop(["col"], axis =1, inplace = True)

37.删除有空值的行?

df.dropna(axis = 0, how = 'any', inplace = True)

38.删除重复值?

df.drop_duplicates(inplace=True)

39.修改数据类型?

df["col"] = df["col"].astype(int)

40.重置索引?

df = df.reset_index(drop = True)

41.按照某一列降序重新排序?

m = df['col'].sort_values(ascending = False).index[:].tolist()
df = df.loc[m]
df = df.reset_index(drop = True)

42.筛选出指标统计大于10的,以均值排序输出前十名?

s = s[s["count"]>20]
s.sort_values("mean", ascending = False).head(10)

43.分组统计输出为DataFram,并且进行列重命名?

df = df.groupby('',as_index = False).count[['','']]
df.rename(columns = {'原来的列名':'新的列名'},inplace = True)
#例如
df.groupby('date')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})

在这里插入图片描述
44.切片分段?(以分数列为例)

cut_bins = np.arrange(90,130,5)#分段设置,这里是分成5段
bins = pd.cut(df['score'], cut_bins)#将数据切片
bin_counts = df['score'].groupby(bins).count()

45.统计列值?

df['col'].value_counts()

46.查看相关性?

df.corr()

47.显示具体的唯一值

df['col'].unique()

48.显示列唯一值个数

df['col'].nunique()

49.返回列最大/小值的索引

df['col'].nlargest(这里指定几个)

df['col'].nsmallest(这里指定几个)

50.列的值进行截断

df['cpl'].clip(min,max)
 #这里将小于min的值变成min,max同理

51.列的值进行替换

df['col'].replace("旧的","新的")
df.replace('列':""旧的","新的")

52.计算列平均值

df['col'].mean()

53.将col列转换为list

df['col'].to_list()

54.按周为采样规则,取一周收盘价最大值

df['收盘价(元)'].resample('W').max()

55.将数据往后移动5天

df.shift(5) 
#将数据向前移动5天为-5

56.使用expending函数计算开盘价的移动窗口均值

data['开盘价(元)'].expanding(min_periods=1).mean()

57.计算每个变量缺失率

df=pd.read_csv('titanic.csv')
missing_series=df.isnull().sum()/df.shape[0]
missing_df=pd.DataFrame(missing_series).reset_index()
missing_df.head()

在这里插入图片描述

def missing_cal(df):
    missing_series=df.isnull().sum()/df.shape[0]
    missing_df=pd.DataFrame(missing_series).reset_index()
    missing_df=missing_df.rename(columns={'index':'col',0:'missing_pct'})
    missing_df=missing_df.sort_values('missing_pct',ascending=False).reset_index(drop=True)
    return missing_df
missing_cal(df)

在这里插入图片描述
58.获取分组里最大值所在的行方法

df=pd.DataFrame({'Sp':['a','b','c','d','e','f'],'Mt':['s1','s1','s2','s2','s2','s3'],'Value':[1,2,3,4,5,6],'Count':[3,2,5,10,10,6]})
df

先按Mt列进行分组,然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列,再用iloc位置索引将行取出有重复值的情况。

df.iloc[df.groupby(['Mt']).apply(lambda x:x['Count'].idxmax())]

在这里插入图片描述
59.多列合并为一行

df=pd.DataFrame({'id_part':['a','b','c','d'],'pred':[0.1,0.2,0.3,0.4],'pred_class':['women','man','cat','dog'],'v_id':['d1','d2','d3','d1']})
df

在这里插入图片描述

df.groupby(['v_id']).agg({'pred_class':[', '.join],'pred':lambda x:list(x),'id_part':'first'}).reset_index()

在这里插入图片描述
60.组内排序

df=pd.DataFrame([['A',1],['A',3],['A',2],['B',5],['B',9]],columns=['name','score'])
df

以下两个运行结果一样

df.sort_values(by=['name','score'],ascending=[True,False])
df.groupby('name').apply(lambda x:x.sort_values(by='score',ascending=False)).reset_index(drop=True)

在这里插入图片描述
61.删除包含特定字符所在的行

df=pd.DataFrame({'a':[1,2,3,4],'b':['s1','exp_s2','s3','exps4'],'c':[5,6,7,8],'d':[3,2,5,10]})
df

在这里插入图片描述

df['b'].str.contains('exp')

在这里插入图片描述

df[df['b'].str.contains('exp')]

在这里插入图片描述
62.选择特定类型的列

df=pd.read_csv('titanic.csv')
df

在这里插入图片描述

#选择所有数值型的列
df.select_dtypes(include=['number']).head()

在这里插入图片描述

#选择所有字符型的列
df.select_dtypes(include=['object']).head()

在这里插入图片描述

#选择所有字符型的列
df.select_dtypes(include=['number','object','category','datetime']).head()

在这里插入图片描述

#用exculde关键字排除指定的数据类型
df.select_dtypes(exclude=['number']).head()

在这里插入图片描述
63.字符串转换数值
避免冗长 直接截图了
在这里插入图片描述64.把series里的列转换为DataFrame
在这里插入图片描述

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值