Python Pandas-添加包含关于行的元数据的列
我想向Dataframe中添加一列,该列将包含一个从行中NaN值的数量派生的数字,具体来说:比行中非NaN值的数量少一个 我试过: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
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
就足够了。