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

Python 将dataframe中的notnull值替换为列表中的值/如何获取notnull值的索引/布尔索引的实现,python,pandas,Python,Pandas,我为一个相当笨拙的标题道歉,我只是从我的更一般的具体问题,我认为这是问题的核心。简单地说,我有一个数据帧和一个列表,其长度与列数或行数相同。我想用列表中相应的值替换数据框中的notnull值 以下是一个例子: 输入数据帧: a b c d a 0.547825 NaN NaN 0.950158 b NaN 0.663845 0.529115 NaN c NaN

我为一个相当笨拙的标题道歉,我只是从我的更一般的具体问题,我认为这是问题的核心。简单地说,我有一个数据帧和一个列表,其长度与列数或行数相同。我想用列表中相应的值替换数据框中的
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]

期望输出:

          a         b         c         d
a         1       NaN        NaN        4
b       NaN         2         3        NaN
c       NaN       NaN       NaN         4
d       NaN         2         3         4
这是我当前的代码:

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
frame=pd.DataFrame(np.random.rand(4,4),索引=['a','b','c','d'],列=['a','b','c','d']))
帧=np.asarray(帧)
帧[帧26打印部分[遮罩]
27 result.iloc[:,i]=Somenums[mask]
28打印结果
TypeError:列表索引必须是整数,而不是序列

如何正确索引它/正确应用掩码?

似乎出现了错误,因为“掩码”是一个数据系列,而不是索引或布尔值。我可以想到的一种方法是,代替for循环,执行以下操作:

idx = frame.notnull()
result = idx * Somenums
result[~idx] = None
如果您不介意用零替换输出中的NaN,可以执行以下操作:

result = frame.notnull() * Somenums
您可以使用,从
列表
创建索引与
df的列名相同的
系列

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

删除
Somenums[mask]
行。
frame.iloc[frame.iloc[:,i].notnull().values,i]=Somenums[i]
应该有效吗?确实有效,太棒了!如果你把它作为答案发布,我会接受它。酷,这也有效!(不,不幸的是我不能有零,但另一个解决方案效果很好。)
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