Bootstrap

python pandas 笔记

1. multiindex  转为单一的 index 
   - df.reset_index(level=[0], drop=True) # drop默认是false
   - 或是 df.index.to_frame() 
2. df.sort_index() 按照 index 来排序
3. pandas 读取 csv, 编码报错,试试这个
df = pd.read_csv("data.csv", encoding='unicode_escape')
4. 



1. pandas melt()  把df 转为单列。
2. 按照列的数据类型来选择数据
df.select_dtypes(include=object)
3. 查看相关性分布
pd.plotting.scatter_matrix(df, figsize=(8, 8))
plt.show()

#### 临时新增笔记
1. S.to_frame()            把 Series 转为 df
2. df.reset_index()        给 df 新增 0--n 的行标签
3. cumsum()                对 Series 或 df 进行累加。shape 不变,值进行累加
4. 按照行标签筛选数据:
   data[data.index.isin(['US','China','United Kingdom','Italy','Germany','France'])]
5. 排序后重新设置 index  
df.sort_values(by='month').reset_index(drop=True)
6. 设置新的行标签。 set_index() 与 reset_index()  是有区别的
df.set_index('event',inplace=True)
7. # Filter all rows for which the player's
# age is greater than or equal to 25
df.drop(df[df['Age'] < 25].index, inplace = True)


# Pandas
1. query
df.query('(a < b) & (b < c)'), 其中, a, b, c 都是列名。
2. take, 可以来选取行或列。
xx.take(positions), positions=[1, 3, 7], 按照某些个单独的下标来选取数据。
3.

# 这3步是经常一起操作的。
df.set_index()
df.sort_index()
df.reset_index()



#### 字符串操作
1. 对一列,进行字符串截取, 以及 str.cointains('xx')
   Series.str.slice(start=0, stop=5, step=3)
2. 
 



#### pandas 分组笔记
分组的过程:split-apply-combine
1. 一般是按照列标签来分组
2. 分组后再进行合并。一般是按照第二个列标签合并, 使用apply() 
 

1. g1 = df.groupby(['my_date']),  会返回一个分组对象,包含了分组列表。
2. 查看
   - g1.groups, 没有括号, 
   - g1.first(),  .last(), .sum()
   - 
   - len(g1)
   - get_group("bar")  选取一组
   - g1['SocialMedia'].value_counts() 分组之后,看看每个国家的社交平台。
   - gg['SocialMedia'].value_counts().loc['China'] 查看中国的社交平台
   - gg['Money'].mean()  查看每个国家的平均工资、
   - gg['Money'].agg(['median', 'mean']) 同时查看 中位数和平均数
   - gg['LanguageWorkedWith'].apply(lambda x: x.str.contains("Python").sum()) 看看每个国家有多少人用 python
    
3. ret = pd.concat([ns, ps], axis='columns', sort=False)
注意这里是 pd, 把2个 Series 组合成一个 DataFrame 

#### 分组的例子
1. df.groupby("A")['B'].apply(lambda B: ','.join(B))
按照 A列 来分组,对 B列进行字符串拼接。

2. df.groupby("A")["B"].nunique().to_frame()
按照 A列 来分组,看看 B 列里面有多少个唯一值。

3. df.groupby("product")['price'].sum()
分组后,直接对价格进行求和。

4. df.groupby("product").size()
查看每个组有多少个元素. 同时还有 sum(), min(), max(), mean() 等等

5. 先按照指定区间切割,再分组。
bins = pd.cut(df['Value'], [0, 100, 250, 1500])
df.groupby(bins)['Value'].agg(['count', 'sum'])

6. 按照A列分组,然后对B列进行计数统计
df2.groupby('A')['B'].count()
 

#### 过滤 筛选。
1. filt = (df['Hobbyist'] == "Yes"), 设置一个过滤参数
   df.loc[filt]  使用过滤参数来选取数据
2. filt = (df['Hobbyist'] == "Yes") & (df['Country'] == "Spain")
   &, 指的是且,同理还有或,| ,以及取反
3. ~filt 取反。
4. 找出工资大于70000的信息,分2步
mf = (df['ConvertedComp'] > 70000)
df.loc[mf]
5. 找出这5个国家的条目
cts = ['United States', 'Canada', 'Germany', 'India']
cf = df['Country'].isin(cts)
df.loc[cf, ['Country']]
6. 是否含有python
fp = df['LanguageWorkedWith'].str.contains('Python', na=False)
df.loc[fp, 'LanguageWorkedWith']
7. 



#### Pandas 笔记,概念,思想,踩坑记录:
1. 对于 Numpy, Pandas-Series,处理这种数据,没必要一个一个迭代。
2. pandas 在处理缺失值的时候,会自动自动填充为 NaN.而且始终保持对齐。
3. 数据选取,数据设置,官方推荐使用 .at, .iat, .loc and .iloc.
4. 更改数值的时候,不能借用中间变量。需要在 df 对象上直接操作。
16. 不推荐迭代。更不推荐在迭代的过程中修改数据。
4. 对 DataFrame 操作的过程中,默认是按照列来对齐。然后拓展每一行。
5. Aggregating  聚合。把多个值,总结到一起。
6. csv数据只能存在3种数据类型   strings, integers and floats.


#### 踩坑记录
1. 读取 xls 文件时, 需要在系统默认环境下安装一个包 xlrd 
2. DataFrame.apply(func) ,对每一行, 或每一列都进行 func 操作
3. 

mode  最常见的数,频率最高的数
mean  就是平均数,总和除以个数
median  是中位数,排序结果中最中间的那个数。


#### Series
1. s.values 获取一个 Series 的值 
2. s.index  获取一个 Series 的索引 
3. s.dtype
4. s.to_frame()  将Series转换为DataFrame
5. 



#### 未整理   DataFrame
3. df.assign() 可以生成一个新的列,但是会返回一个新的对象。
5. df.T 会进行行列互换。也会返回一个新的对象。
6. df.to_string() 会显示成扁平的输出。多行变成一行。也许会有点混乱。
15. 删除列,行,多列,多行,df.drop(["one"], axis=1)。注意会返回一个新的对象
17. 类型转换。df3.astype("float32")。查看类型   df.dtypes


# pandas 基础部分

#### 读取文件
1. pd.read_csv("survey_results_schema.csv", index_col='Name')
   把 Name 设置为行标签。更改默认的 0--n 标签
2. 

#### 显示设置
1.  每行每列最多显示多少条。 
pd.set_option('display.max_columns', 85)  设置显示的列数
pd.set_option('display.max_rows', 85)
2. 

####  预览大概信息。
1. df.shape         (行,列)
2. df.info()         显示数据的行列,以及数据类型。这是个方法、  
4. df.describe() 查看基本信息。更详细一些。只会操作数值类的列。
5. 


#### 选取
1. df.loc['xxx'] 是按照【行标签】来选取行。
2. df['xxx']  默认是按照【列标签】来选取列。
1. df.loc[0, "name"]       loc 是按照名称来选取
2. df.loc[:2, 'Hobbyist':'Employment'] 可以使用冒号来连选多个列。
7. df.A, 可以直接获取A列。假如 A列的名称是A
8. df[:2] 也可以获取前2行。便捷。但是不推荐使用。不严谨。



#### 计算
1. df['Hobbyist'].value_counts(), 对一个 Series 进行计数。
9. 减法。df.sub(row_2, axis="columns") 按照行来减去第二行的值。
10. 另外还有 add(), mul(), div(), 都是类似的。
11. df.add(df2, fill_value=0) 把空值填充为0
12. 比较运算。eq(), lt(), gt() 
13. (df > 0).all(), 指的是,是不是没一行的值都大于0. 以及 any(), enmpty()
14. df.mean(axis=0), 0 指的是按照行来求每一行的平均值。1 指的是列。以及 all()
15. 对一个 Series 求平均值 df['Money'].median() 。  会忽略 NaN 
16. df.median()  求中位数。


#### 计数 
1. df['Money'].count()  看看有多少个有效数据。
2. df['Country'].value_counts()  看看每个国家分别有多少条有效数据
3. df['SocialMedia'].value_counts(normalize=True) 按照百分比显示。
4. df['YearsCode'].unique() 查看唯一值,不重复的值有哪些。
5. 

#### 类型转换
1. 把日期设置整数类型。
2. df['age'] = df['age'].astype(float) , 把字符串类型转为浮点数
3. df.astype(xxx) 转换全部的类型。
4. 处理这个问题。'Less than 1 year'
   - 先看看有多少个不重复的值。
   - 方法 1:df['YearsCode'].value_counts()
   - 方法 2: df['YearsCode'].unique()
   - df['YearsCode'].replace('Less than 1 year', 0, inplace=True)
   - 类型转换: df['YearsCode'] = df['YearsCode'].astype(float)
   - 查看数据: df['YearsCode'].mean()


#### 日期处理
1. 字符串, 转日期类型,转换 2020-03-13 04-PM	
   - df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d %I-%p')
   - %I Hour (12-hour clock) as a decimal number [01,12].
   - %p Locale's equivalent of either AM or PM.
2. 查看一周的哪一天 df.loc[0, 'Date'].day_name()  --> Friday
3. 在读取的过程中, 转换日期类型。
   my_parser = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %I-%p')
   df = pd.read_csv('ETH_1h.csv', parse_dates=['Date'], date_parser=my_parser)
4. 借助 dt Class 查看一个 Series的内容 ,比如查看每天是哪一天
   df['Date'].dt.day_name()5. 把原来按照小时分割的数据,变成按照天数来分割。
   - hx = df['High'].resample('D').max()
   - %matplotlib inline
   - hx.plot()    # 直接绘图。
6. 对多列进行分割,自定义方法。
   df.resample('W').agg({'High': 'max', 'Close': 'mean', 'Low': 'min', 'Volume': 'sum'})



#### 空值处理。
1. df.dropna()  不加参数, 会去除含有 NaN None 的行。
   默认参数 df.dropna(axis='index', how='any')
2. df.dropna(axis='index', how='any', subset=['Employment'])
   指定忽略的参数。
3. 替换整个 DataFrame,  df.replace('NA', np.nan, inplace=True)
4. df.isna() 只是想大致看看哪些值是空值。
5. 把空值填充为0。df.fillna(0, inplace=True)  就地更改
6. 


#### 修改,更改,更新数据
1. df.columns = [x.upper() for x in df.columns]  更改原始数据。
2. df.columns.str.lower()   不更改原始数据。
3. df.columns.str.replace(" ", "_")
4. df.rename(columns={"country": "cty"}, inplace=True)  修改某一列的标题。
5. df.loc[2] = ['a', 'b', 'c']    修改一行的数据
6. 借助过滤来更新数据
   filt = (df['age'] > 20)
   df.loc[filt, 'nice'] = True
7. apply() 可以对一个 Series 或 DataFrame 进行操作。
   - df.loc[:10, 'Country'].apply(len)  操作一个 Series
   - df.apply(len) 这里查看的是每一个列,有多少条数据, 默认是按按行计数
   - df.apply(len, axis='columns') 显示每行有多少数据,按列计数。
8. applymap(), 只能用于操作 DataFrame
9. map() 只能用于操作 Series 修改特定值,全部修改。
   如果目标字段不在字典里面,会被转为 NaN 
   比如把全部 yes-no 转为 True, False
   df['Hobbyist'].map({'Yes': True, 'No': False})
10. replace() 可以用于替换,类似 普通字符串的替换。
11. 新增一列 df['fullname'] = df['a'] + ' ' + df['b']
12. 新增多列 
    - 先选取并分割: x = df['LanguageWorkedWith'].str.split(';', expand=True)
    - 然后赋值 df[['lang_1', 'lang_2']] = x
13. 删除2列 df.drop(columns=['a', 'b'], inplace=True)
14. 新增1行 df.append({"index": 'value'}, ignore_index=True)
15. 新增一个 DataFrame
    df = df.append(df2, ignore_index=True, sort=False)
16. 删除一行 df.drop(index=1, inplace=False)
17. 按照条件筛选,然后删除多行
    - filt = (df['name'] == 'AAA')
    - df.drop(index=df[filt].index)
18.  
 

#### 行列转置
1. df.set_index("name")   把列标签设置为行标签。默认返回新得对象
2. df.set_index("name", inplace=True)  会改变原始数据
3. df.reset_index(inplace=True)    恢复原始数据
4. 

 
####  排序
1. df2.sort_index()   按照行标签,默认的排序规则,比如a-z
2. df2.sort_index(ascending=False, inplace=True), 逆序且更改。
3. 按照 列标签 排序 df.sort_values(by="col_1")
4. 按照列标签,多级排序,且分别限定升序,降序
   df.sort_values(by=["col_1", "col_2"], ascending=[True, False])
5. 对一个 Series() 进行排序
   df['name'].sort_values()
6. 查看最大值,最小值。
   - Series 中,查看前10个最大值  df['Money'].nlargest(10)
   - DataFrame 中,查看前10个最大值, df.nlargets(10, 'Money')  
   - 这个会显示10条详细的信息 
   - 同理有 最小值  nsmallest()


#### plot 画图
1. 设置行列标签以及标题
ax = g3.plot(kind='bar',alpha=0.75, rot=0, title="年龄段分布情况")
ax.set_xticklabels(g3["年龄分布"])
ax.set_xlabel("年龄段")
ax.set_ylabel("数量")

;