假设我有一个结构类似于下面的Pandas Dataframe :
data = {
'A' : [5.0, np.nan, 1.0],
'B' : [7.0, np.nan, np.nan],
'C' : [9.0, 2.0, 6.0],
'D' : [np.nan, 4.0, 9.0],
'E' : [np.nan, 6.0, np.nan],
'F' : [np.nan, np.nan, np.nan],
'G' : [np.nan, np.nan, 8.0]
}
df = pd.DataFrame(
data,
index=['11','22','33']
)
从每一行中,我想提取最长的连续非空值块,并将它们附加到列表中。
因此,这些行中的以下值:
row11: [5,7,9]
row22: [2,4,6]
row33: [6,9]
给我一个值列表:
[5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 6.0, 9.0]
我当前的方法使用iterrows()
first_valid_index()
和last_valid_index()
:
mylist = []
for i, r in df.iterrows():
start = r.first_valid_index()
end = r.last_valid_index()
mylist.extend(r[start: end].values)
当有效数字被分块在一起时,例如row11
和row22
,这种方法很好用。但是,当数字中散布着空值时,例如row33
,我的方法就失败了。在这种情况下,我的方法提取整行,因为第一个和最后一个索引包含非空值。我的解决方案(错误地)输出了一个最终列表:
[5.0, 7.0, 9.0, 2.0, 4.0, 6.0, 1.0, nan, 6.0, 9.0, nan, nan, 8.0]
我有以下问题:
1.)我该如何应对row33
示例中遇到的错误呢?
2.)有没有比使用iterrows()
更有效的方法?我的实际数据有数千行。虽然它不一定太慢,但我总是谨慎地使用Pandas时诉诸迭代。
3条答案
按热度按时间3vpjnl9f1#
一个选项是使用
groupby
获取非NA的拉伸,使用max
过滤最长的拉伸:输出:
xlpyo6sf2#
使用
numpy.ma.masked_invalid
和numpy.ma.clump_unmasked
函数将行拆分为 * non-nan * 值的连续切片,并选择长度最大的切片:nukf8bse3#
使用切片和列表解析的另一种方法: