0

假设您有一个包含大量列的 DataFrame df,例如 50,并且 df 没有任何索引(即 index_col=None)。您希望选择由 required_columns_list 定义的列的子集,但希望仅返回满足各种布尔索引定义的多个条件的那些行。有没有办法使用 dict 生成器简洁地生成选择语句?

举个例子:

df = pd.DataFrame(np.random.randn(100,50),index=None,columns=["Col" + ("%03d" % (i + 1)) for i in range(50)])

# df.columns = Index[u'Col001', u'Col002', ..., u'Col050']

required_columns_list = ['Col002', 'Col012', 'Col025', 'Col032', 'Col033']

现在让我们想象一下我定义:

boolean_index_dict = {'Col001':"MyAccount", 'Col002':"Summary", 'Col005':"Total"}

我想选择使用 dict 生成器来构造多个布尔索引:

df.loc[GENERATOR_USING_boolean_index_dict, required_columns_list].values

上面的生成器布尔方法相当于:

df.loc[(df['Col001']=="MyAccount") & (df['Col002']=="Summary") & (df['Col005']=="Total"), ['Col002', 'Col012', 'Col025', 'Col032', 'Col033']].values

希望您可以看到这在操作大型 DataFrame 时非常有用的“模板”,然后可以在 boolean_index_dict 中定义布尔索引。如果您能告诉我这在 Pandas 中是否可行以及如何构造 GENERATOR_USING_boolean_index_dict,我将不胜感激。非常感谢和亲切的问候,伯蒂

ps 如果您想对此进行测试,您将需要使用文本填充一些 df 列。如果需要测试,则使用随机数定义 df 只是作为入门...

4

1 回答 1

1

假设这是你的 df:

df = pd.DataFrame(np.random.randint(0,4,(100,50)),index=None,columns=["Col" + ("%03d" % (i + 1)) for i in range(50)])

# the first five cols and rows:
df.iloc[:5,:5]

   Col001  Col002  Col003  Col004  Col005
0       2       0       2       3       1
1       0       1       0       1       3
2       0       1       1       0       3
3       3       1       0       2       1
4       1       2       3       1       0

与您的示例相比,所有列都填充了 0、1、2 或 3 的整数。

让我们定义标准:

req = ['Col002', 'Col012', 'Col025', 'Col032', 'Col033']
filt = {'Col001': 2, 'Col002': 2, 'Col005': 2}

所以我们想要一些列,而其他一些列都包含值 2。

然后,您可以通过以下方式获得结果:

df.loc[df[filt.keys()].apply(lambda x: x.tolist() == filt.values(), axis=1), req]

就我而言,这是结果:

    Col002  Col012  Col025  Col032  Col033
43       2       2       1       3       3
98       2       1       1       1       2

让我们检查这些行所需的列:

df[filt.keys()].iloc[[43,98]]

    Col005  Col001  Col002
43       2       2       2
98       2       2       2

以及其他一些(不匹配的)行:

df[filt.keys()].iloc[[44,99]]

    Col005  Col001  Col002
44       3       0       3
99       1       0       0

我开始越来越喜欢 Pandas。

于 2013-10-15T11:56:12.650 回答