Python pandas 在每行后面插入空行

问题描述 投票:0回答:6

您好,我正在尝试使用 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
6个回答
9
投票

我认为在数据帧上使用追加效率非常低(每次都必须为整个数据帧重新分配内存)。

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

6
投票
 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))) 

2
投票

如果您提供了更多有用的信息,但我想到的是使用此命令

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)

2
投票

这有效

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


1
投票

这是一个用一个循环来完成此操作的函数:

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

© www.soinside.com 2019 - 2024. All rights reserved.