Pandas:找到empty/missing个值并将它们添加到DataFrame

Pandas: Find empty/missing values and add them to DataFrame

我有数据框,其中第 1 列应具有从 1 到 169 的所有值。如果值不存在,我想向我的数据框添加一个新行,其中包含所述值(和一些零)。

即使没有错误,我也无法使以下代码工作:

for i in range(1,170):
    if i in df.col1 is False:
        df.loc[len(df)+1] = [i,0,0]
    else:
        continue

有什么建议吗?

做这样的事情会更好:

In [37]:
# create our test df, we have vales 1 to 9 in steps of 2
df = pd.DataFrame({'a':np.arange(1,10,2)})
df['b'] = np.NaN
df['c'] = np.NaN
df
Out[37]:
   a   b   c
0  1 NaN NaN
1  3 NaN NaN
2  5 NaN NaN
3  7 NaN NaN
4  9 NaN NaN
In [38]:
# now set the index to a, this allows us to reindex the values with optional fill value, then reset the index
df = df.set_index('a').reindex(index = np.arange(1,10), fill_value=0).reset_index()
df
Out[38]:
   a   b   c
0  1 NaN NaN
1  2   0   0
2  3 NaN NaN
3  4   0   0
4  5 NaN NaN
5  6   0   0
6  7 NaN NaN
7  8   0   0
8  9 NaN NaN

所以只是解释上面的内容:

In [40]:
# set the index to 'a', this allows us to reindex and fill missing values
df = df.set_index('a')
df
Out[40]:
    b   c
a        
1 NaN NaN
3 NaN NaN
5 NaN NaN
7 NaN NaN
9 NaN NaN
In [41]:
# now reindex and pass fill_value for the extra rows we want
df = df.reindex(index = np.arange(1,10), fill_value=0)
df
Out[41]:
    b   c
a        
1 NaN NaN
2   0   0
3 NaN NaN
4   0   0
5 NaN NaN
6   0   0
7 NaN NaN
8   0   0
9 NaN NaN
In [42]:
# now reset the index
df = df.reset_index()
df
Out[42]:
   a   b   c
0  1 NaN NaN
1  2   0   0
2  3 NaN NaN
3  4   0   0
4  5 NaN NaN
5  6   0   0
6  7 NaN NaN
7  8   0   0
8  9 NaN NaN

如果您将循环修改为以下内容,那么它将起作用:

In [63]:

for i in range(1,10):
    if any(df.a.isin([i])) == False:
        df.loc[len(df)+1] = [i,0,0]
    else:
        continue
df
Out[63]:
   a   b   c
0  1 NaN NaN
1  3 NaN NaN
2  5 NaN NaN
3  7 NaN NaN
4  9 NaN NaN
6  2   0   0
7  4   0   0
8  6   0   0
9  8   0   0

编辑

如果您希望缺失的行出现在 df 的末尾,那么您可以创建一个临时 df,将所有值范围和其他列设置为零,然后根据这些值过滤此 df在另一个 df 中丢失并连接它们:

In [70]:

df_missing = pd.DataFrame({'a':np.arange(10),'b':0,'c':0})
df_missing
Out[70]:
   a  b  c
0  0  0  0
1  1  0  0
2  2  0  0
3  3  0  0
4  4  0  0
5  5  0  0
6  6  0  0
7  7  0  0
8  8  0  0
9  9  0  0
In [73]:

df = pd.concat([df,df_missing[~df_missing.a.isin(df.a)]], ignore_index=True)
df
Out[73]:
   a   b   c
0  1 NaN NaN
1  3 NaN NaN
2  5 NaN NaN
3  7 NaN NaN
4  9 NaN NaN
5  0   0   0
6  2   0   0
7  4   0   0
8  6   0   0
9  8   0   0

表达式 if i in df.col1 is False 的计算结果始终为假。我认为它正在查看索引。另外我认为你需要在 pandas 的现代版本中使用 pandas.concat 而不是分配给 df.loc[].

我建议将所有缺失值收集在一个列表中,然后在最后将它们连接到数据框。例如

>>> df = pd.DataFrame({'col1': range(5) + [i + 6 for i in range(5)], 'col2': range(10)})
>>> print df
   col1  col2
0     0     0
1     1     1
2     2     2
3     3     3
4     4     4
5     6     5
6     7     6
7     8     7
8     9     8
9    10     9
>>> to_add = []
>>> for i in range(11):
...     if i not in df.col1.values:
...         to_add.append([i, 0])
...     else:
...         continue
...        
>>> pd.concat([df, pd.DataFrame(to_add, columns=['col1', 'col2'])])
   col1  col2
0     0     0
1     1     1
2     2     2
3     3     3
4     4     4
5     6     5
6     7     6
7     8     7
8     9     8
9    10     9
0     5     0

我假设您不关心您添加的行的索引值。