You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从DataFrame多列提取非NaN值并合并为单列数组

问题解决思路与代码实现

你好!针对你这个合并DataFrame行内非NaN元组的需求,我整理了清晰的实现思路和可运行的代码:

问题回顾

你当前的DataFrame结构:

col1                col2                col3
0  (10.213,-20.23)  (120.1,-300.23)  (111.0, -231.1)
1  (11.22,-22.33)   (123.1,-302.23)  (nan, nan)
2  (122.22,-22.44)  (nan,nan)        (nan, nan)

期望输出:

col1
0  ((10.213,-20.23),(120.1,-300.23),(111.0, -231.1))
1  ((11.22,-22.33),(123.1,-302.23))
2  (122.22,-22.44)

实现思路

核心就是逐行筛选有效元组,再合并成目标格式,具体分三步:

  • 第一步:先明确判断规则——这里的无效元组是(nan, nan),所以写个小函数检查元组内元素是否不全为NaN。
  • 第二步:对DataFrame的每一行,遍历所有列,收集其中的有效元组。
  • 第三步:根据有效元组的数量调整输出格式:如果只有1个,直接返回该元组;如果多个,就嵌套成一个大元组,最后把结果整理成新的DataFrame。

代码示例

下面是直接可用的Python代码,基于pandas库实现:

import pandas as pd
import numpy as np

# 构造你的示例DataFrame
data = {
    'col1': [(10.213,-20.23), (11.22,-22.33), (122.22,-22.44)],
    'col2': [(120.1,-300.23), (123.1,-302.23), (np.nan, np.nan)],
    'col3': [(111.0, -231.1), (np.nan, np.nan), (np.nan, np.nan)]
}
df = pd.DataFrame(data)

# 辅助函数:判断元组是否为有效(非全NaN)
def is_valid_tuple(t):
    return not all(pd.isna(item) for item in t)

# 行处理函数:收集当前行的所有有效元组并组合
def combine_row_tuples(row):
    valid_tuples = [t for t in row if is_valid_tuple(t)]
    # 根据有效元组数量返回对应格式
    if len(valid_tuples) == 1:
        return valid_tuples[0]
    else:
        return tuple(valid_tuples)

# 应用到每一行,生成结果DataFrame
result_df = df.apply(combine_row_tuples, axis=1).to_frame('col1')

# 打印结果
print(result_df)

运行这段代码后,输出就完全符合你的预期啦。

内容的提问来源于stack exchange,提问作者NZ_DJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:57:34