Python 如何列出包含数据的列的最频繁组合

Python 如何列出包含数据的列的最频繁组合,python,pandas,itertools,Python,Pandas,Itertools,你好 我正在处理以杂乱无章和完全不同著称的地质数据集。我想做的是:输出一个列组合列表,其中对于一定数量的列,NaN空闲行数最高 e、 g 如果我输入2,那么它将返回一个包含['a'、'B']和5的列表,因为a和B列有5个完整的行。如果我输入3,返回['D','E','F']和4,因为它们有4个完整的行。如果我输入5,那么我会得到['A','B','C','D','E','F']和2,因为它们有两整行 提前多谢 我想这就是你想要的。这将不返回列列表,而是返回一个或多个列列表,以说明非NA行的“最佳

你好

我正在处理以杂乱无章和完全不同著称的地质数据集。我想做的是:输出一个列组合列表,其中对于一定数量的列,NaN空闲行数最高

e、 g

如果我输入2,那么它将返回一个包含['a'、'B']和5的列表,因为a和B列有5个完整的行。如果我输入3,返回['D','E','F']和4,因为它们有4个完整的行。如果我输入5,那么我会得到['A','B','C','D','E','F']和2,因为它们有两整行


提前多谢

我想这就是你想要的。这将不返回列列表,而是返回一个或多个列列表,以说明非NA行的“最佳”数量有关联的实例

import pandas as pd
from itertools import combinations
from math import nan

def best_combinations(df, n_cols):
    best_cols = []
    best_length = 0
    for cols in combinations(df.columns, n_cols):
        subdf = df.loc[:, list(cols)].dropna()
        if len(subdf) > best_length:
            best_length = len(subdf)
            best_cols = [cols]
        elif (len(subdf) == best_length) and (best_length > 0):
            best_cols.append(cols)
    return best_cols, best_length
在数据帧上:

df = pd.DataFrame({
 'A': {0: '2', 1: '4', 2: '3', 3: '4', 4: '6', 5: nan, 6: nan},
 'B': {0: '6', 1: '5', 2: '4', 3: '5', 4: '7', 5: nan, 6: nan},
 'C': {0: '3', 1: '6', 2: nan, 3: nan, 4: nan, 5: nan, 6: nan},
 'D': {0: '7', 1: '7', 2: nan, 3: nan, 4: nan, 5: '5', 6: '7'},
 'E': {0: '7', 1: '5', 2: nan, 3: nan, 4: nan, 5: '6', 6: '5'},
 'F': {0: '3', 1: '4', 2: nan, 3: nan, 4: nan, 5: '7', 6: '8'}}
)

best_combinations(df, 2)
# returns:
[('A', 'B')], 5

best_combinations(df, 3)
[('D', 'E', 'F')], 4

为了让问题更清楚,我认为实际的公式应该是:对于给定数量的列,具有最多NaN自由行的列的组合是什么。以及这些行的数量。这很有效,非常感谢!当它执行我需要的功能时,有没有什么方法可以更快地完成?在我的例子中,在27000行数据集中,从70列中找到最好的3列大约需要15分钟。我想得到大约30个样品,我不认为它可以处理!干杯我已经在代码中添加了这一行:subdf=df.dropna(axis=0,thresh=len(df.columns.tolist()-n_cols+1)
df = pd.DataFrame({
 'A': {0: '2', 1: '4', 2: '3', 3: '4', 4: '6', 5: nan, 6: nan},
 'B': {0: '6', 1: '5', 2: '4', 3: '5', 4: '7', 5: nan, 6: nan},
 'C': {0: '3', 1: '6', 2: nan, 3: nan, 4: nan, 5: nan, 6: nan},
 'D': {0: '7', 1: '7', 2: nan, 3: nan, 4: nan, 5: '5', 6: '7'},
 'E': {0: '7', 1: '5', 2: nan, 3: nan, 4: nan, 5: '6', 6: '5'},
 'F': {0: '3', 1: '4', 2: nan, 3: nan, 4: nan, 5: '7', 6: '8'}}
)

best_combinations(df, 2)
# returns:
[('A', 'B')], 5

best_combinations(df, 3)
[('D', 'E', 'F')], 4