您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 在大熊猫煤柱上有更好的可读性吗?

5b51 2022/1/14 8:23:20 python 字数 3261 阅读 581 来源 www.jb51.cc/python

我经常需要一个新列,这是我可以从其他列获得的最好的列,我有一个特定的优先级列表.我愿意取第一个非空值. def coalesce(values): not_none = (el for el in values if el is not None) return next(not_none, None) df = pd.DataFrame([{'third':'B','first

概述

def coalesce(values):
    not_none = (el for el in values if el is not None)
    return next(not_none,None)

df = pd.DataFrame([{'third':'B','first':'A','second':'C'},{'third':'B','first':None,'second':None},{'third':None,'second':None}])

df['combo1'] = df.apply(coalesce,axis=1)
df['combo2'] = df[['second','third','first']].apply(coalesce,axis=1)
print df

结果

first second third combo1 combo2
0     A      C     B      A      C
1  None      C     B      C      C
2  None   None     B      B      B
3  None   None  None   None   None
4     A   None     B      A      B

这个代码可以工作(结果是我想要的),但是它不是很快.
如果我需要[[第二个,第三个,第一个]]]

有些类似于同名的函数从tsql.
我怀疑我可能忽略了一个简单的方法来实现它,在大数据帧(40万行)上表现良好,

我知道有很多方法可以填写我经常在axis = 0上使用的丢失数据
这是什么让我觉得我可能错过了一个easy = 1的选项

你能建议一些更好或更快的东西吗?或者确认这是一样好.

In [169]: pd.isnull(df)
Out[169]: 
   first second  third
0  False  False  False
1   True  False  False
2   True   True  False
3   True   True   True
4  False   True  False

然后使用np.argmin找到第一个非空值的索引.如果所有值都为空,则np.argmin返回0:

In [186]: np.argmin(pd.isnull(df).values,axis=1)
Out[186]: array([0,1,2,0])

然后可以使用NumPy整数索引从df中选择所需的值:

In [193]: df.values[np.arange(len(df)),np.argmin(pd.isnull(df).values,axis=1)]
Out[193]: array(['A','C','B',None,'A'],dtype=object)

例如,

import pandas as pd
df = pd.DataFrame([{'third':'B','second':None}])

mask = pd.isnull(df).values
df['combo1'] = df.values[np.arange(len(df)),np.argmin(mask,axis=1)]
order = np.array([1,0])
mask = mask[:,order]
df['combo2'] = df.values[np.arange(len(df)),order[np.argmin(mask,axis=1)]]

产量

first second third combo1 combo2
0     A      C     B      A      C
1  None      C     B      C      C
2  None   None     B      B      B
3  None   None  None   None   None
4     A   None     B      A      B

如果DataFrame有很多行,则使用argmin而不是df3.apply(coalesce,…)显着更快:

df2 = pd.concat([df]*1000)

In [230]: %timeit mask = pd.isnull(df2).values; df2.values[np.arange(len(df2)),axis=1)]
1000 loops,best of 3: 617 µs per loop

In [231]: %timeit df2.apply(coalesce,axis=1)
10 loops,best of 3: 84.1 ms per loop

总结

以上是编程之家为你收集整理的python – 在大熊猫煤柱上有更好的可读性吗?全部内容,希望文章能够帮你解决python – 在大熊猫煤柱上有更好的可读性吗?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶