用列表中的值替换pandas dataframe中的notnull值/如何获取notnull值的索引/布尔索引的实现

2024-10-04 01:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我为一个相当笨拙的标题道歉,我只是从我的具体问题中得到了更一般的,我认为这是问题的核心。简单地说,我有一个数据帧和一个与列数或行数相同长度的列表。我想用列表中的相应值替换dataframe中的notnull值。在

示例如下: 输入数据帧:

          a         b         c         d
a  0.547825       NaN       NaN  0.950158
b       NaN  0.663845  0.529115       NaN
c       NaN       NaN       NaN  0.685002
d       NaN  0.791249  0.574452  0.734804

输入列表:[1, 2, 3, 4]

期望输出:

^{pr2}$

这是我当前的代码:

frame = pd.DataFrame(np.random.rand(4,4),index=['a','b','c','d'], columns=['a','b','c','d'])
frame = np.asarray(frame)
frame[frame<0.5] = np.nan
frame = pd.DataFrame(frame,index=['a','b','c','d'], columns=['a','b','c','d'])

result = np.zeros((4,4))
result = pd.DataFrame(result, index=['A','B','C','D'], columns=['A','B','C','D'])
Somenums = [1,2,3,4]

for i, col in enumerate(frame.columns.values):
    print frame[col]
    print np.isfinite(frame[col])
    mask = frame.ix[np.isfinite(frame[col]),col]
    print mask
    print Somenums[mask]
    result.iloc[:,i] = Somenums[mask]
print result

但我收到:

TypeError                                 Traceback (most recent call last)
<ipython-input-34-c95f4f5ee05b> in <module>()
     24     mask = frame.ix[np.isfinite(frame[col]),col]
     25     print mask
---> 26     print Somenums[mask]
     27     result.iloc[:,i] = Somenums[mask]
     28 print result

TypeError: list indices must be integers, not Series

我怎样才能正确地索引它/正确地应用遮罩?在


Tags: columns数据dataframe列表indexnpmaskcol
2条回答

错误似乎是因为“mask”是一个数据系列而不是index或boolean。我能想到的一种方法是,不用for循环,而是执行以下操作:

idx = frame.notnull()
result = idx * Somenums
result[~idx] = None

如果您不介意在输出中使用零来替换nan,可以执行以下操作:

^{pr2}$

您可以使用^{},from list是必需的,创建索引与df相同的Series

Somenums = [1, 2, 3, 4]

df = df.mask(df.notnull(), pd.Series(Somenums, index=df.columns), axis=1)
print (df)
     a    b    c    d
a  1.0  NaN  NaN  4.0
b  NaN  2.0  3.0  NaN
c  NaN  NaN  NaN  4.0
d  NaN  2.0  3.0  4.0

相关问题 更多 >