我想在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想要一个row_index和一个column_index,但我不知道这些是否是在每个数据帧中预先定义的,我只需要以某种方式指定它们,或者我是否需要以某种方式在数据帧上“设置”索引循环放置新值的位置 val 。
答案 0 :(得分:1)
你可以在不使用循环的情况下以矢量化方式完成它,这可能比循环版本更快:
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
。
答案 1 :(得分:0)
您可以将作为for循环一部分定义的index
变量用作.loc正在寻找的row_index:
for index, row in df.iterrows():
count = row.value_counts()
val = sum(count) - 1
df.loc[index, 'Num Hits'] = val