Python Pandas-添加包含关于行的元数据的列

Python Pandas-添加包含关于行的元数据的列,python,loops,pandas,indexing,dataframe,Python,Loops,Pandas,Indexing,Dataframe,我想向Dataframe中添加一列,该列将包含一个从行中NaN值的数量派生的数字,具体来说:比行中非NaN值的数量少一个 我试过: for index, row in df.iterrows(): count = row.value_counts() val = sum(count) - 1 df['Num Hits'] = val 返回一个错误: -c:4: SettingWithCopyWarning: A value is trying to be set on

我想向Dataframe中添加一列,该列将包含一个从行中NaN值的数量派生的数字,具体来说:比行中非NaN值的数量少一个

我试过:

for index, row in df.iterrows():
    count = row.value_counts()
    val = sum(count) - 1
    df['Num Hits'] = val
返回一个错误:

-c:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

并将第一个val值放入新列的每个单元格中。我试着阅读Pandas文档中的.loc和索引,但没有理解它。我收集到了。loc想要一个行索引和一个列索引,但我不知道它们是否在每个数据帧中都是预定义的,我只需要以某种方式指定它们,或者在告诉循环在哪里放置新值val之前,我是否需要在数据帧上以某种方式“设置”索引。

您完全可以以矢量化的方式进行操作,而无需使用循环,这可能比循环版本快:

In [89]:

print df
          0         1         2         3
0  0.835396  0.330275  0.786579  0.493567
1  0.751678  0.299354  0.050638  0.483490
2  0.559348  0.106477  0.807911  0.883195
3  0.250296  0.281871  0.439523  0.117846
4  0.480055  0.269579  0.282295  0.170642
In [90]:
#number of valid numbers - 1
df.apply(lambda x: np.isfinite(x).sum()-1, axis=1)
Out[90]:
0    3
1    3
2    3
3    3
4    3
dtype: int64

@DSM提出了一个很好的观点,即上述解决方案仍然没有完全矢量化。矢量化形式可以是
(~df.isnull()).sum(axis=1)-1

您可以使用定义为for循环一部分的
索引变量作为.loc正在查找的行索引:

for index, row in df.iterrows():
    count = row.value_counts()
    val = sum(count) - 1
    df.loc[index, 'Num Hits'] = val

但是,由于
apply
,这并没有完全矢量化。类似于
np.isfinite(df).sum(axis=1)-1
的东西应该绕过所有Python循环。对,
(~df.isnull()).sum(axis=1)-1
就足够了。