繁体   English   中英

获取前导 NaN 和尾随非 NaN 值的数量 pandas dataframe

[英]Get the amount of leading NaN and trailing non NaN values in pandas dataframe

我有一个 dataframe,其中行包含 NaN 值。 df 包含原始列,即Heading 1 Heading 2 和 Heading 3以及名为Unnamed: 1 Unnamed: 2 和 Unnamed: 3额外列,如图所示:

标题 1 标题 2 标题 3 未命名:1 未命名:2 未命名:3
钠盐 34 24 45 钠盐 钠盐
钠盐 钠盐 24 45 11 钠盐
钠盐 钠盐 钠盐 45 45 33
4个 钠盐 24 钠盐 钠盐 钠盐
钠盐 钠盐 4个 钠盐 钠盐 钠盐
钠盐 34 24 钠盐 钠盐 钠盐
22 34 24 钠盐 钠盐 钠盐
钠盐 34 钠盐 45 钠盐 钠盐

我想遍历每一行并找出原始列(标题 1 标题 2 和标题 3)前导 NaN 值的数量以及额外列中非 NaN 值的数量(未命名:1 未命名:2 和未命名:3 ) 对于每一行,这应该被计算并在字典中返回,其中键是行的索引,该键的值是一个列表,其中包含原始列前导 NaN 值的数量(标题 1 标题 2 和标题 3 ) 和列表的第二个元素是额外列中非 NaN 值的数量(未命名:1 未命名:2 和未命名:3)。

所以上面 dataframe 的结果是:

{0 : [1, 1], 
1 : [2, 2], 
2 : [3, 3], 
3 : [0, 0], 
4 : [2, 0], 
5 : [1, 0],
6 : [0, 0],
7 : [1, 1]}

请注意在第 3 行和第 7 行中,原始列分别包含 1 和 2 个 NaN,但只计算前导 NaN,而不计算中间的 NaN!

谢谢!

作为备选:

df['Count'] = df[['Heading 1', 'Heading 2']].apply(lambda x: sum(x.isnull()), axis=1)
df['Count2'] = df[['Unnamed: 1', 'Unnamed: 2']].apply(lambda x: sum(x.notnull()), axis=1)
df['total']=df[['Count','Count2']].values.tolist()

output=dict(zip(df.index, df.total))
'''
{0: [1, 1], 1: [2, 1], 2: [1, 0], 3: [0, 0], 4: [2, 2], 5: [2, 1]}
'''

要么

mask=list(map(list, zip(df[['Heading 1', 'Heading 2']].isnull().sum(axis=1), df[['Unnamed: 1', 'Unnamed: 2']].notnull().sum(axis=1))))
output=dict(zip(df.index,mask))
#{0: [1, 1], 1: [2, 1], 2: [1, 0], 3: [0, 0], 4: [2, 2], 5: [2, 1]}

.isna() (在Cyzanfar 的回答中)为我提出了一个例外:

AttributeError: 'numpy.float64' object has no attribute 'isna'

您可以改为尝试以下操作:

counts = {}

for index, row in df.iterrows():
# Count the number of NaN values in the original columns
num_nan_orig = np.sum(np.isnan(row[['Heading 1', 'Heading 2']]))

# Count the number of non-NaN values in the extra columns
num_non_nan_extra = np.sum(~np.isnan(row[['Unnamed: 1', 'Unnamed: 2']]))

counts[index] = [num_nan_orig, num_non_nan_extra]
print(counts) 

输出如下:

# {0: [1, 1], 1: [2, 1], 2: [1, 0], 3: [0, 0], 4: [2, 2], 5: [2, 1]}

~运算符(代码中的倒数第三行)是 Python 中的按位取反运算符,它反转其操作数的 boolean 值。 在这种情况下,它会反转 np.isnan() 方法生成的 boolean 值,以便可以计算非 NaN 值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM