您好,我正在尝试使用 pandas 在当前数据的每行后面插入 3 个空行,然后导出数据。例如,当前数据样本可以是:
name profession
Bill cashier
Sam stock
Adam security
理想情况下我想要实现的目标:
name profession
Bill cashier
Nan Nan
Nan Nan
Nan Nan
Sam stock
Nan Nan
Nan Nan
Nan Nan
Adam security
Nan Nan
Nan Nan
Nan Nan
我已经尝试过 itertools,但是我不确定如何使用此方法在每行之后精确地获取三个空行。任何帮助、指导、样品都将不胜感激!
我认为在数据帧上使用追加效率非常低(每次都必须为整个数据帧重新分配内存)。
DataFrame 旨在分析数据并轻松添加列,而不是行。
所以我认为一个好的方法是创建一个正确大小的新数据框,然后将数据传输给它。最简单的方法是使用索引。
# Demonstration data
data = 'name profession Bill cashier Sam stock Adam security'
data = np.array(data.split()).reshape((4,2))
df = pd.DataFrame(data[1:],columns=data[0])
# Add n blank rows
n = 3
new_index = pd.RangeIndex(len(df)*(n+1))
new_df = pd.DataFrame(index=new_index, columns=df.columns, dtype='object')
ids = np.arange(len(df))*(n+1)
new_df.loc[ids] = df.values
print(new_df)
输出:
name profession
0 Bill cashier
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 Sam stock
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 Adam security
9 NaN NaN
10 NaN NaN
11 NaN NaN
insert_rows = 3 # how many rows to insert
df.index = range(0, insert_rows * len(df), insert_rows)
# create new_df with added rows
new_df = df.reindex(index = range(insert_rows * len(df)))
如果您提供了更多有用的信息,但我想到的是使用此命令
df.append(pd.Series(), ignore_index=True)
这将向您的数据框添加一个空行,但正如您所看到的,您必须传递 set
ignore_index=True
,否则追加将无法工作。
下面的代码包含一个在数据框的现有行之间添加空行的函数。
可能不是您想要执行的操作的最佳方法,导出数据时添加空白行可能会更好。
import pandas as pd
def add_blank_rows(df, no_rows):
df_new = pd.DataFrame(columns=df.columns)
for idx in range(len(df)):
df_new = df_new.append(df.iloc[idx])
for _ in range(no_rows):
df_new=df_new.append(pd.Series(), ignore_index=True)
return df_new
df = pd.read_csv('test.csv')
df_with_blank_rows = add_blank_rows(df, 3)
print(df_with_blank_rows)
这有效
df_new = pd.DataFrame()
for i, row in df.iterrows():
df_new = df_new.append(row)
for _ in range(3):
df_new = df_new.append(pd.Series(), ignore_index=True)
df
当然是原始的DataFrame
这是一个用一个循环来完成此操作的函数:
def NAN_rows(df):
row = df.shape[0]
x = np.empty((3,2,)) # 3 empty row and 2 columns. You can increase according to your original df
x[:] = np.nan
df_x = pd.DataFrame( columns = ['name' ,'profession'])
for i in range(row):
temp = np.vstack([df.iloc[i].tolist(),x])
df_x = pd.concat([df_x, pd.DataFrame(temp,columns = ['name' ,'profession'])], axis=0)
return df_x
df = pd.DataFrame({
'name' : ['Bill','Sam','Adam'],
'profession' : ['cashier','stock','security']
})
print(NAN_rows(df))
#Output:
name profession
0 Bill cashier
1 nan nan
2 nan nan
3 nan nan
0 Sam stock
1 nan nan
2 nan nan
3 nan nan
0 Adam security
1 nan nan
2 nan nan
3 nan nan