Pandas使用实用技巧
Pandas实用使用技巧
1 列拆分成行
常见的需求是将某一列根据指定的分隔符拆分成多列。现有需求,根据指定的分隔符将其拆分为多行。
例:
df = A B 0 a f 1 b;c h;g 2 d k 3 e l
现需要将其拆分为:
df = A B 0 a f 1 b h 1 c g 2 d k 3 e l
1.1 处理A列
实现过程如下:
df = pd.DataFrame({'A': ['a', 'b;c', 'd', 'e'], 'B': ['f', 'h;j', 'k', 'l']}) df
A B
0 a f
1 b;c h;j
2 d k
3 e l
将A列按照“;”分割,并展开为DataFrame,该效果由expand参数空值:
df_a = df['A'].str.split(';', expand=True) df_a 0 1 0 a None 1 b c 2 d None 3 e None
将df_a进行堆积:
df_a = df_a.stack() df_a 0 0 a 1 0 b 1 c 2 0 d 3 0 e dtype: object
将内层索引重置为列并删除掉:
df_a = df_a.reset_index(level=1, drop=True) df_a 0 a 1 b 1 c 2 d 3 e dtype: object
重命名该Series,否则接下来合并会失败:
df_a.rename('A_split', inplace=True) df_a 0 a 1 b 1 c 2 d 3 e Name: A_split, dtype: object
1.2 处理列B
处理过程同列A,最后重命名后为:
df_b.rename('B_split', inplace=True) df_b 0 f 1 h 1 j 2 k 3 l Name: B_split, dtype: object
1.3 合并A_split和B_split
水平合并处理完成后的两列:
concat_a_b = pd.concat([df_a, df_b], axis=1) concat_a_b
A_split B_split 0 a f 1 b h 1 c j 2 d k 3 e l
1.4 最后和原数据合并
将最终处理的数据和原数据根据索引进行合并:
df = df.join(concat_a_b, how='inner') df A B A_split B_split 0 a f a f 1 b;c h;j b h 1 b;c h;j c j 2 d k d k 3 e l e l
最后达到了想要的效果。
2 切片插入多行
常见的需求是在指定的位置插入一行或者一列。现有需求,在指定的位置插入多行或者多列:
df = pd.DataFrame({'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28,34,29,42]}) df Out[4]: Name Age 0 Tom 28 1 Jack 34 2 Steve 29 3 Ricky 42 df1 = pd.DataFrame({'Name':['Anna', 'Susie'],'Age':[20,50]}) df1 Out[6]: Name Age 0 Anna 20 1 Susie 50
df2 = pd.DataFrame({'Name':['Anna', 'Susie', 'Jhone'],'Age':[20, 50, 35]})
df2
Out[10]:
Name Age
0 Anna 20
1 Susie 50
2 Jhone 35
2.1 将df1作为整体插入索引2的位置
通过numpy的insert方法实现数组重构,然后再将数组构造成需要的表格:
np.insert(df.values, 2, df1.values, axis=0) Out[7]: array([['Tom', 28], ['Jack', 34], ['Anna', 20], ['Susie', 50], ['Steve', 29], ['Ricky', 42]], dtype=object)
可以观察到数据被插入到df索引2的位置。可以根据原来的列名直接构造DataFrame来实现需求:
pd.DataFrame(np.insert(df.values, 2, df1.values, axis=0), columns=df.columns) Out[8]: Name Age 0 Tom 28 1 Jack 34 2 Anna 20 3 Susie 50 4 Steve 29 5 Ricky 42
2.2 将df2每一行分开插入到指定位置
通过numpy的insert方法实现数组重构,然后再将数组构造成需要的表格:
np.insert(df.values, (0, 1, 2), df2.values, axis=0) Out[12]: array([['Anna', 20], ['Tom', 28], ['Susie', 50], ['Jack', 34], ['Jhone', 35], ['Steve', 29], ['Ricky', 42]], dtype=object)
可以观察到数据被插入到df索引0、1、2的位置。可以根据原来的列名直接构造DataFrame来实现需求:
pd.DataFrame(np.insert(df.values, (0, 1, 2), df2.values, axis=0), columns=df.columns) Out[13]: Name Age 0 Anna 20 1 Tom 28 2 Susie 50 3 Jack 34 4 Jhone 35 5 Steve 29 6 Ricky 42