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

时间:2014-08-08 15:23:59

标签: 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 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

2 个答案:

答案 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