希望有人能帮助我。
给定每列一个值,我成功过滤了 Pandas 数据框(如下面的代码所示)。但是,根据我正在运行的分析,有时我想避免指定要过滤的值(例如,我想忽略 seg_device 的过滤并仅基于 os 过滤数据帧)。
然而,下面的代码迫使我总是指定一些值(例如桌面)。如果我将 seg_device
留空,则 df_ch_seg
将不返回任何数据,条件是 df_ch.device == seg_device
。
有人对如何使我的代码更灵活有什么建议吗?我的数据集由 100 万行组成,每 16 列。下面你只看到 2 个过滤器,但我总共有 15 个(其中一些是整数,一些是字符串列)。谢谢!
通过查看下面的代码,我想对它稍作更改,使其在多种情况下都能正常工作:
# [...]
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)]
答案 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)