新建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)

结果:

012
0111213
1212223
2313233
3414243

插入一列

任意位置插入一列比较简单,用自带的pd.insert即可实现

# 待插入列索引
col_n = 1
# 待插入数据,以一维列表为例
d = ["*"] * 4
# 参数:添加列索引,添加列名,添加数据,是否允许列名重复
pd_arr.insert(col_n, "*", d, allow_duplicates=False)

结果:

0*12
011*1213
121*2223
231*3233
341*4243

插入一行

任意位置插入一行时自带的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*12
011*1213
1****
221*2223
331*3233
441*4243

可以将这几行代码整理成一个方法,以便于重复调用,如(以添加一维列表为例):

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)

没有受到新插入数据的影响

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐