numpy 基于条件从嵌入式框架中提取行[已关闭]

v1uwarro  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(108)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
上个月关门了。
Improve this question
基于一些条件从pandas中提取行,例如:数据框:

使用条件:
1.其中列a1不是“do”,所有其他列都是“do”:产出:

1.其中列a1和a2不是'do',所有其他列都是'do':

基本上,我们一个接一个地迭代列,如果有值不是“do”,而其余列的值是“do”,则通过组合列索引和前列来提取嵌套框。

zzlelutf

zzlelutf1#

下面的代码演示了一个动态实现,它可能接近您的需要。请根据您的具体用例进一步完善它。

import pandas as pd
data = {
    'Col1': ['OK', 'OK', 'OK', 'OK', 'Not OK', 'OK'],
    'Col2': ['OK', 'Not OK', 'OK', 'Not OK', 'OK', 'Not OK'],
    'Col3': ['OK', 'OK', 'OK', 'Not OK', 'Not OK', 'OK'],
    'Col4': ['IS OK', 'OK', 'Not OK', 'Not OK', 'Not OK', 'OK'], 
    'Col5': ['Not OK', 'OK', '!=OK', 'Not OK', 'Not OK', 'Not OK'] 
}
df = pd.DataFrame(data)
masks = []
for col in df.columns:
    if col in ['Col1', 'Col2', 'Col3']:
        masks.append(df[col] == 'OK')
    elif col in ['Col4', 'Col5']:
        masks.append(df[col] != 'OK')
combined_mask = masks[0]
for mask in masks[1:]:
    combined_mask = combined_mask & mask
print(df[combined_mask])

输出

前3列为“OK”,后2列为“NOT”

Col1 Col2 Col3    Col4    Col5                                                                    
0   OK   OK   OK   IS OK  Not OK                                                                    
2   OK   OK   OK  Not OK    !=OK
soat7uwm

soat7uwm2#

确切的逻辑还不清楚,但你不需要解释,使用布尔索引:

# conditions
m1 = df['a1'].ne('do')
m2 = df['a2'].ne('do')
m3 = df.drop(columns=['a1', 'a2']).eq('do').all(axis=1)

# a1 is not 'do' and all other columns are 'do'
out1 = df[m1 & (~m2) & m3]

# a1 & a2 is not 'do' and all other columns are 'do'
out2 = df[m1 & m2 & m3]

对于更动态的方法,可以定义分组列:

cols = ['a1', 'a2']

group = df[cols].ne('do').mul(2**np.arange(len(cols))).sum(axis=1)

out_dfs = dict(list(df[df.drop(columns=cols).eq('do').all(axis=1)].groupby(group)))

输出将是一个多个嵌套的字典,键是非do列的二进制编码组合。

相关问题