1. multiindex 转为单一的 index
- df.reset_index(level=[0], drop=True)
- 或是 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.
df.drop(df[df['Age'] < 25].index, inplace = True)
1. query
df.query('(a < b) & (b < c)'), 其中, a, b, c 都是列名。
2. take, 可以来选取行或列。
xx.take(positions), positions=[1, 3, 7], 按照某些个单独的下标来选取数据。
3.
df.set_index()
df.sort_index()
df.reset_index()
1. 对一列,进行字符串截取, 以及 str.cointains('xx')
Series.str.slice(start=0, stop=5, step=3)
2.
分组的过程: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.
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 是中位数,排序结果中最中间的那个数。
1. s.values 获取一个 Series 的值
2. s.index 获取一个 Series 的索引
3. s.dtype
4. s.to_frame() 将Series转换为DataFrame
5.
3. df.assign() 可以生成一个新的列,但是会返回一个新的对象。
5. df.T 会进行行列互换。也会返回一个新的对象。
6. df.to_string() 会显示成扁平的输出。多行变成一行。也许会有点混乱。
15. 删除列,行,多列,多行,df.drop(["one"], axis=1)。注意会返回一个新的对象
17. 类型转换。df3.astype("float32")。查看类型 df.dtypes
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()
1. 设置行列标签以及标题
ax = g3.plot(kind='bar',alpha=0.75, rot=0, title="年龄段分布情况")
ax.set_xticklabels(g3["年龄分布"])
ax.set_xlabel("年龄段")
ax.set_ylabel("数量")