关于pandas

enumerate()

  • 循环读出每个列的索引值和列名
    • for col_num, col_name in enumerate(df):

dataframe.groupby(条件选择)

  • 用法

  • DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

    • by :接收映射、函数、标签或标签列表;用于确定聚合的组。
    • axis : 接收 0/1;用于表示沿行(0)或列(1)分割。
    • level : 接收int、级别名称或序列,默认为None;如果轴是一个多索引(层次化),则按一个或多个特定级别分组。
    • as_index:接收布尔值,默认Ture;Ture则返回以组标签为索引的对象,False则不以组标签为索引。
  • 示例

df = pd.DataFrame({'Gender' : ['男', '女', '男', '男', '男', '男', '女', '女', '女'],
                   'name' : ['周杰伦', '蔡依林', '林俊杰', '周杰伦', '林俊杰', '周杰伦',
                              '田馥甄','蔡依林', '田馥甄'],
                   'income' : [4.5, 2.9, 3.8, 3.7, 4.0, 4.1, 1.9, 4.1, 3.2],
                   'expenditure' : [1.5, 1.9, 2.8, 1.7, 4.1, 2.5, 1.1, 3.4, 1.2]
                  })
print(df)

输出:

Gender name  income  expenditure
0      男  周杰伦     4.5          1.5
1      女  蔡依林     2.9          1.9
2      男  林俊杰     3.8          2.8
3      男  周杰伦     3.7          1.7
4      男  林俊杰     4.0          4.1
5      男  周杰伦     4.1          2.5
6      女  田馥甄     1.9          1.1
7      女  蔡依林     4.1          3.4
8      女  田馥甄     3.2          1.2
  • 根据其中一列分组
df_expenditure = df.groupby(['Gender'])

输出:(迭代器?)

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000265342B3320>
df_expenditure = df.groupby(['Gender'])
for group_name, group_data in df_expenditure:
    print(group_data)

输出:

('女',   Gender name  income  expenditure
1      女  蔡依林     2.9          1.9
6      女  田馥甄     1.9          1.1
7      女  蔡依林     4.1          3.4
8      女  田馥甄     3.2          1.2)
('男',   Gender name  income  expenditure
0      男  周杰伦     4.5          1.5
2      男  林俊杰     3.8          2.8
3      男  周杰伦     3.7          1.7
4      男  林俊杰     4.0          4.1
5      男  周杰伦     4.1          2.5)
df_expenditure = df.groupby(['Gender'])['name']
for group_name, group_data in df_expenditure:
    print(group_name)
    print(group_data)

输出:(主键为性别,分类找出对应的所有名字)

('女', 1    蔡依林
6    田馥甄
7    蔡依林
8    田馥甄
Name: name, dtype: object)
('男', 0    周杰伦
2    林俊杰
3    周杰伦
4    林俊杰
5    周杰伦
  • 最后可以利用sum(),mean(),count(),size()来做计算

dataframe.sort_values

  • 案例
df_expenditure = df.groupby(['name','Gender']).sum()
df_expenditure = df_expenditure.sort_values(by='expenditure', ascending=True)
print(df_expenditure)

输出:

                       income  expenditure
name Gender                     
田馥甄  女          5.1          2.3
蔡依林  女          7.0          5.3
周杰伦  男         12.3          5.7
林俊杰  男          7.8          6.9
  • 以'name','Gender'为组合主键,按照expenditure升序排列

dataframe.isin

  • 语法
df_list = df['name'].isin(['周杰伦','蔡依林'])
print(df_list)
words_pd_select = df[df_list]
print(words_pd_select)
  • 输出:
0     True
1     True
2    False
3     True
4    False
5     True
6    False
7     True
8    False
Name: name, dtype: bool

Gender name  income  expenditure
0      男  周杰伦     4.5          1.5
1      女  蔡依林     2.9          1.9
3      男  周杰伦     3.7          1.7
5      男  周杰伦     4.1          2.5
7      女  蔡依林     4.1          3.4
  • 条件选择,选择特定维度,特定的值

mean,sum,drop

axis=1

people=DataFrame(np.ones((5,5)),
                 columns=['a','b','c','d','e'],
                 index=['Joe','Steve','Wes','Jim'])

print(people.mean(axis=1))
print (people.drop('Jim',axis=0))

输出:

Joe      5.0
Steve    5.0
Wes      5.0
Jim      5.0


         b    c    d    e
Joe    1.0  1.0  1.0  1.0
Steve  1.0  1.0  1.0  1.0
Wes    1.0  1.0  1.0  1.0
Jim    1.0  1.0  1.0  1.0


第一个列子 df.mean(axis=1)代表沿着列水平方向计算均值,
而第二个列子df.drop(name, axis=1) 代表将name对应的列
标签沿着水平的方向依次删掉。

isnull()的运用

  • 查找缺失值
  • isnull().any(axis)
    • axis = 0 选择列 默认
    • axis = 1 选择行
  • isnull().any().sum()
    • 计算计算缺失值列总数
  • dataframe[df.isnull().any(axis=1)]
    • 输出含有null值的整行数据

.str.cat

  • 多列拼接
    • 适用于一维数据Series或字符串,可以使用astype(np.str),转换成字符串格式
  • 示例
rfm_pd['d'] = rfm_pd_tmp['a'].str.cat(rfm_pd_tmp['b']).str.cat(
    rfm_pd_tmp['b'])
新增d列,把a.b.c列字符拼接
输入:pd.Series(['a','b','c']).str.cat(sep=';')
输出:'a;b;c'

输入:pd.Series(['a','b','c']).str.cat(['A','B','C'], sep=';')
输出:
0  a;A
1  b;B
2  c;C

pd.concat

  • 多个dataframe拼接
  • 示例
a = pd.DataFrame(np.ones((2,2)),columns=['pro1', 'pro2'])
print(a)

b = pd.DataFrame(np.random.random((2,1)), columns=['dd'])
print(b)
predict_pd = pd.concat((a,b), axis=1)
print(predict_pd)
  • 输出
pro1  pro2
0   1.0   1.0
1   1.0   1.0

         dd
0  0.236130
1  0.058731

   pro1  pro2        dd
0   1.0   1.0  0.236130
1   1.0   1.0  0.058731

pd.fillna()

  • pd.fillna(值) 所有缺失值填充
  • pd.fillna(字典) 给指定的列填充指定的值
    • 字典:{列名:值}

交叉表 crosstab

  • 交叉表是用于统计分组频率的特殊透视表
pd.crosstab(主属性, 需要分组统计的属性,margins=True)
margins=True 表示添加累加列

用正则取出属性

df.filter(regex=**)

get_dummies 特征因子化

以Cabin为例,原本一个属性维度,因为其取值可以是[‘yes’,‘no’],而将其平展开为’Cabin_yes’,'Cabin_no’两个属性

原本Cabin取值为yes的,在此处的"Cabin_yes"下取值为1,在"Cabin_no"下取值为0
原本Cabin取值为no的,在此处的"Cabin_yes"下取值为0,在"Cabin_no"下取值为1

dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix= 'Cabin')
print(dummies_Cabin.head())
  • 输出
   Cabin_No  Cabin_Yes
0         1          0
1         0          1
2         1          0
3         0          1
4         1          0

add_prefix(str)

  • 对于Series,行标签是前缀的。对于DataFrame,列标签是前缀的。
参数: prefix : str要在每个标签前添加的字符串。
返回: Series 或 DataFrame具有更新标签的新Series或DataFrame。
原文地址:https://www.cnblogs.com/rener0424/p/11242652.html