Pandas DataFrame实现任意位置插入一列或一行
作者:盛夏光年ltk
Pandas是Python中最流行的数据处理和分析库之一,在数据分析过程中,有时候需要在Dataframe中插入新的数据列,本文主要介绍了Pandas DataFrame实现任意位置插入一列或一行,具有一定的参考价值,感兴趣的可以了解一下
新建DataFrame
import numpy as np import pandas as pd arr = [11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43] # 转化为4行3列的numpy数组 np_arr = np.array(arr).reshape((4, 3)) # 转化为DataFrame pd_arr = pd.DataFrame(np_arr)
结果:
0 | 1 | 2 | |
---|---|---|---|
0 | 11 | 12 | 13 |
1 | 21 | 22 | 23 |
2 | 31 | 32 | 33 |
3 | 41 | 42 | 43 |
插入一列
任意位置插入一列比较简单,用自带的pd.insert即可实现
# 待插入列索引 col_n = 1 # 待插入数据,以一维列表为例 d = ["*"] * 4 # 参数:添加列索引,添加列名,添加数据,是否允许列名重复 pd_arr.insert(col_n, "*", d, allow_duplicates=False)
结果:
0 | * | 1 | 2 | |
---|---|---|---|---|
0 | 11 | * | 12 | 13 |
1 | 21 | * | 22 | 23 |
2 | 31 | * | 32 | 33 |
3 | 41 | * | 42 | 43 |
插入一行
任意位置插入一行时自带的pd.append无法实现(append只能在最后添加一行),需要先将原DataFrame拆分,添加新数据后再组合
# 待插入行索引 row_n = 1 # 待插入数据,以一维列表为例 d = [["*"] * 4] # 拆分 pd_arr1 = [:row_n] pd_arr2 = [row_n:] # 参数:添加数据,是否无视行索引 pd_arr = pd_arr1.append(d, ignore_index=True).append(pd_arr2, ignore_index=True)
结果:
0 | * | 1 | 2 | |
---|---|---|---|---|
0 | 11 | * | 12 | 13 |
1 | * | * | * | * |
2 | 21 | * | 22 | 23 |
3 | 31 | * | 32 | 33 |
4 | 41 | * | 42 | 43 |
可以将这几行代码整理成一个方法,以便于重复调用,如(以添加一维列表为例):
def df_insert(df, n, arr, ignore_index=True): """ DataFrame任意位置添加一行 :param df: DataFrame :param n: 添加行号索引 :param arr: 添加数据 :param ignore_index: 是否无视行索引,为True则重新从0生成df的行号 :return: DataFrame """ # 如果原df列名被修改,则需要给新插入的行也赋予列名 # arr = pd.DataFrame(np.array(arr).reshape((1, len(arr))), columns=df.columns) # 否则直接插入二维数组即可 arr = [arr] df1 = df[:n] df2 = df[n:] df0 = df1.append(arr, ignore_index).append(df2, ignore_index) return df0 # 待插入行索引 row_n = 1 # 待插入数据,以一维列表为例 d = ["*"] * 4 # 调用方法 pd_arr = df_insert(pd_arr, row_n, d)
补充
用yield迭代DataFrame时插入新的行,迭代结果不受影响
def df_yield(df): # index=True时返回结果Pandas类型数据中将带Index # 即 Pandas(Index=*, column_name=*, ...) for row in df.itertuples(index=False): yield row y = df_yield(df_arr) # 用try except StopIteration判断迭代结束 y0 = next(y) print("index 0 ", y0) # index 0 插入新的数据 pd_arr = pd_insert(pd_arr, 0, ["*"] * 3) y1 = next(y) print("index 1 ", y1)
结果:
index 0 Pandas(_0=11, _1=12, _2=13)
index 1 Pandas(_0=21, _1=22, _2=23)
没有受到新插入数据的影响
到此这篇关于Pandas DataFrame实现任意位置插入一列或一行的文章就介绍到这了,更多相关Pandas DataFrame任意位置插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!