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填充空值
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)
s = s[s["count"]>20]
s.sort_values("mean", ascending = False).head(10)
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()