基于每列具有多个值的多列过滤 Pandas Dataframe

时间:2021-04-24 17:52:09

标签: python pandas

希望有人能帮助我。

给定每列一个值,我成功过滤了 Pandas 数据框(如下面的代码所示)。但是,根据我正在运行的分析,有时我想避免指定要过滤的值(例如,我想忽略 seg_device 的过滤并仅基于 os 过滤数据帧)。

然而,下面的代码迫使我总是指定一些值(例如桌面)。如果我将 seg_device 留空,则 df_ch_seg 将不返回任何数据,条件是 df_ch.device == seg_device

有人对如何使我的代码更灵活有什么建议吗?我的数据集由 100 万行组成,每 16 列。下面你只看到 2 个过滤器,但我总共有 15 个(其中一些是整数,一些是字符串列)。谢谢!

通过查看下面的代码,我想对它稍作更改,使其在多种情况下都能正常工作:

  • 如果我想按一台设备(例如移动设备)进行过滤
  • 如果我想按 2 个设备(例如移动设备、桌面设备)进行过滤
  • 如果我不想按设备过滤(我希望我的代码忽略按设备过滤)
# [...]

seg_device = input('Enter device (e.g. desktop, ...): ')
seg_os = input('Enter operating system (e.g. Mac/iOS, Windows, ...):  ')

# [...]

# Define new dataframe df_ch_seg, based on df_ch, segmented based on above input values 
df_ch_seg = df_ch[(df_ch.device == seg_device)& (df_ch.os == seg_os)]

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你只是想把它变成一个函数,其中提供的输入将是 (column, filter_value) 的元组。

from ast import literal_eval

def mask_constructor(filters):
    mask = []
    for (col, val) in filters:
        op = (f"df_ch[{col}] == {val}")
        mask.append(op)
    return literal_eval(" & ".join(mask))

那么你可以这样称呼它。

mask = mask_constructor(("device", "iPhone"), ("os", "iOS"))
df_ch[mask]

答案 1 :(得分:0)

也许此代码可以提供帮助。这里'a'是seg_device,'b'是seg_os。所以确保 a='' 和 b=''。如果您未指定(输入)'a',则 'a' 将被设置为 df['A'],因此该列中的所有值都将有效。可以对数据框中的 'b' 和其他列执行相同的操作。希望这很清楚。

d = {'A':['a','b','a','b','a'], 'B':[1,2,3,4,5]}
df = pd.DataFrame(data=d)

a ='' # a is not specified and remains empty
if a=='': 
  a=df['A'] # set 'a' to all values in df['A'] 
b=1

(df['A']==a) & (df['B']>b)
相关问题