【问题标题】:Python pandas insert empty rows after each rowPython pandas 在每行之后插入空行
【发布时间】:2021-06-02 13:43:36
【问题描述】:
您好,我正在尝试使用 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,但是我不确定如何使用这种方法在每行之后精确地获得三个空行。任何帮助、指导、样品都将不胜感激!
【问题讨论】:
标签:
python
python-3.x
pandas
【解决方案1】:
如果您提供了更多有用的信息,但想到的是使用此命令
df.append(pd.Series(), ignore_index=True)
这将为您的数据框添加一个空行,但正如您所见,您必须传递 set ignore_index=True,否则附加将不起作用。
【解决方案2】:
下面的代码包含一个在数据框的现有行之间添加空行的函数。
可能不是您想要做的最佳方法,在导出数据时添加空白行可能会更好。
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)
【解决方案3】:
这行得通
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
【解决方案4】:
这是一个用一个循环来做到这一点的函数:
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
【解决方案5】:
我认为在数据帧上使用附加是非常低效的(每次都必须为整个数据帧重新分配内存)。
DataFrames 用于分析数据和轻松添加列,而不是行。
所以我认为一个好方法是创建一个正确大小的新数据框,然后将数据传输到它。最简单的方法是使用索引。
# 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(np.nan, index=new_index, columns=df.columns)
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
【解决方案6】:
# df1 is your original dataframe
# df2 is the resulting dataframe with empty rows
# 3 is the amount of rows you want to insert (change to number of rows you need):
df1.index = range(0, 3*len(df1), 3)
df2 = df1.reindex(index=range(3*len(df1)))