【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)

沒有受到新插入數據的影響


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM