如何在python数据帧中的确定行之后添加一个空行?

时间:2018-03-14 11:00:33

标签: python pandas for-loop dataframe concat

我正在使用python中的大型数据框,有时我需要在数据帧的确定位置添加一个空行或多行。对于这个问题,我创建了一个小型数据帧df,以显示我想要实现的目标。

>  df = pd.DataFrame(np.random.randint(10, size = (3,3)), columns =
> ['A','B','C'])
>        A  B  C
>     0  4  5  2
>     1  6  7  0
>     2  8  1  9

假设我在“C”列中有一个零值,我需要添加一个空行。这里应该在第二行之后添加空行。所以最后我想要一个新的数据框,如:

>new_df
>        A    B    C
>     0  4    5    2
>     1  6    7    0
>     2  nan  nan  nan
>     3  8    1    9

我尝试使用concat并附加,但我没有得到我想要的东西。请问你能帮帮我吗?

4 个答案:

答案 0 :(得分:2)

您可以尝试这种方式:

l = df[df['C']==0].index.tolist()
for c, i in enumerate(l):
    dfs = np.split(df, [i+1+c])
    df = pd.concat([dfs[0], pd.DataFrame([[np.NaN, np.NaN, np.NaN]], columns=df.columns), dfs[1]], ignore_index=True)
print df

输入:

   A  B  C
0  4  3  0
1  4  0  4
2  4  4  2
3  3  2  1
4  3  1  2
5  4  1  4
6  1  0  4
7  0  2  0
8  2  0  3
9  4  1  3

输出:

    A    B    C
0   4.0  3.0  0.0
1   NaN  NaN  NaN
2   4.0  0.0  4.0
3   4.0  4.0  2.0
4   3.0  2.0  1.0
5   3.0  1.0  2.0
6   4.0  1.0  4.0
7   1.0  0.0  4.0
8   0.0  2.0  0.0
9   NaN  NaN  NaN
10  2.0  0.0  3.0
11  4.0  1.0  3.0

最后一件事:可能会发生最后一行在'C'中为0,因此您可以添加:

if df["C"].iloc[-1] == 0 :
    df.loc[len(df)] = [np.NaN, np.NaN, np.NaN]

答案 1 :(得分:1)

如果你知道要插入新行的索引,concat可以是一个解决方案。

示例数据框:

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
#    A  B  C
# 0  1  4  7
# 1  2  5  8
# 2  3  6  9

您的新行作为索引为1的数据框:

new_row = pd.DataFrame({'A': np.nan, 'B': np.nan,'C': np.nan}, index=[1])

在第二行之后插入新行:

new_df = pd.concat([df.loc[:1], new_row, df.loc[2:]]).reset_index(drop=True)
#      A    B    C
# 0  1.0  4.0  7.0
# 1  2.0  5.0  8.0
# 2  NaN  NaN  NaN
# 3  3.0  6.0  9.0

答案 2 :(得分:1)

尝试使用切片。

首先,你需要找到C == 0的行。所以让我们为此创建一个bool df。我只是将其命名为' a':

a = (df['C'] == 0)

因此,只要C == 0,a == True。

现在我们需要找到C == 0的每一行的索引,创建一个空行并将其添加到df:

df2 = df.copy() #make a copy because we want to be safe here
for i in df.loc[a].index:
    empty_row = pd.DataFrame([], index=[i]) #creating the empty data
    j = i + 1 #just to get things easier to read
    df2 = pd.concat([df2.ix[:i], empty_row, df2.ix[j:]]) #slicing the df

df2 = df2.reset_index(drop=True) #reset the index

我必须说...我不知道您的df的大小,如果这个足够快,请尝试一下

答案 3 :(得分:0)

这样的事情对你有用:

for key, row in df.iterrows():
    if  row['C'] == 0:
        df.loc[key+1] = pd.Series([np.nan])