首页 > 解决方案 > 跨数据框'Pandas'中的行查询

问题描述

我有一个如下所述的数据框,我怎样才能获得对不同“组织”的整体业务贡献至少 30% 的“类别”。我尝试了以下查询,但没有奏效。

Organization_category_df = df.loc[(df['Year 2014-15']) >= 0.3 * (df['Category'] == 'Total Business')]

在此处输入图像描述

我的错误是我无法添加表格,无论如何我创建了一个至少应该有助于复制数据的 html 表格。

<table>
<tr>
    <th>Year 2014-15</th>
    <th>Category</th>
    <th>Organization</th>
</tr>
 <tr>
    <td>35000</td>
    <td>laptop</td>
    <td>xyz</td>
  </tr>
	 <tr>
    <td>25000</td>
    <td>tablet</td>
    <td>xyz</td>
  </tr>	
   <tr>
    <td>40000</td>
    <td>mobile</td>
    <td>xyz</td>
  </tr>
   <tr>
    <td>100000</td>
    <td>Total Business</td>
    <td>xyz</td>
  </tr>
<tr>
    <td>23000</td>
    <td>laptop</td>
    <td>pqr</td>
  </tr>
	 <tr>
    <td>10000</td>
    <td>tablet</td>
    <td>pqr</td>
  </tr>	
   <tr>
    <td>15000</td>
    <td>mobile</td>
    <td>pqr</td>
  </tr>
   <tr>
    <td>48000</td>
    <td>Total Business</td>
    <td>pqr</td>
  </tr>
</table>

标签: pythonpandasdataframe

解决方案


IIUC,带有小计的行(“总业务”)使事情变得复杂。很容易创建一个boolean mask来过滤掉这些,然后你可以使用groupby.transform来过滤你的DataFrame.

pandas.concat如果需要,您可以使用和重新插入“总业务”行sort_index

mask = df['Category'].eq('Total Business')

df_filtered = df[~mask]
df_filtered = df_filtered[df_filtered.groupby('Organization')['Year 2014-15'].transform(lambda x: x / x.sum()).ge(0.3)]
print(df_filtered)

[出去]

   Year 2014-15 Category Organization
0         35000   laptop          xyz
2         40000   mobile          xyz
4         23000   laptop          pqr
6         15000   mobile          pqr    

并重新添加了“总业务”:

df_filtered = pd.concat([df_filtered, df[mask]]).sort_index()

[出去]

   Year 2014-15        Category Organization
0         35000          laptop          xyz
2         40000          mobile          xyz
3        100000  Total Business          xyz
4         23000          laptop          pqr
6         15000          mobile          pqr
7         48000  Total Business          pqr

推荐阅读