Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 表:聚合函数上的过滤器_Python_Pandas_Dataframe_Pandas Groupby_Pivot Table - Fatal编程技术网

Python 表:聚合函数上的过滤器

Python 表:聚合函数上的过滤器,python,pandas,dataframe,pandas-groupby,pivot-table,Python,Pandas,Dataframe,Pandas Groupby,Pivot Table,我试图将一个条件传递给聚合函数到表,但我无法确定如何将该条件传递给aggfunc。我有一个数据表,它被转换为df 输入表数据: 可乐 可乐 可乐 可乐 可乐 可乐6 可乐 1. 测试1 t1 笨蛋 结果1 10 102.2 2. 测试1 t1 傻瓜2 结果2 20 101.2 3. 测试1 t1 傻瓜3 结果3 30 102.3 4. 测试1 t1 傻瓜4 结果4 40 101.4 5. 测试2 t1 笨蛋 结果1 10 100 6. 测试2 t1 傻瓜2 结果2 20 103 7. 测试2 t

我试图将一个条件传递给聚合函数到表,但我无法确定如何将该条件传递给aggfunc。我有一个数据表,它被转换为df

输入表数据:

可乐 可乐 可乐 可乐 可乐 可乐6 可乐 1. 测试1 t1 笨蛋 结果1 10 102.2 2. 测试1 t1 傻瓜2 结果2 20 101.2 3. 测试1 t1 傻瓜3 结果3 30 102.3 4. 测试1 t1 傻瓜4 结果4 40 101.4 5. 测试2 t1 笨蛋 结果1 10 100 6. 测试2 t1 傻瓜2 结果2 20 103 7. 测试2 t1 傻瓜3 结果3 30 104 8. 测试2 t1 傻瓜4 结果4 40 105 9 测试3 t1 笨蛋 结果1 10 102 10 测试3 t1 傻瓜2 结果2 20 87 11 测试3 t1 傻瓜3 结果3 30 107 12 测试3 t1 傻瓜5 结果4 50 110.2 13 测试4 t1 傻瓜2 结果2 20 120 14 测试5 t1 笨蛋 结果1 100 88 15 测试1 t1 笨蛋 结果2 10 106.2 16 测试1 t1 笨蛋 结果6 10 101.1
无法通过
=
将单词“max”与100进行比较(
aggfunc='max'>=100
):

我建议不要将填充值设置为字符串,屏蔽数据帧,以消除不需要的行,然后通过以下方式替换为空字符串:

res>=100
且:

清除多重索引和清除轴名称的可选选项:

res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)

完整的工作示例:

import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
    'col2': ['test1', 'test1', 'test1', 'test1', 'test2', 'test2', 'test2',
             'test2', 'test3', 'test3', 'test3', 'test3', 'test4', 'test5',
             'test1', 'test1'],
    'col3': ['t1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1',
             't1', 't1', 't1', 't1', 't1'],
    'col4': ['Dummy1', 'Dummy2', 'Dummy3', 'Dummy4', 'Dummy1', 'Dummy2',
             'Dummy3', 'Dummy4', 'Dummy1', 'Dummy2', 'Dummy3', 'Dummy5',
             'Dummy2', 'Dummy6', 'Dummy1', 'Dummy1'],
    'col5': ['result1', 'result2', 'result3', 'result4', 'result1', 'result2',
             'result3', 'result4', 'result1', 'result2', 'result3', 'result4',
             'result2', 'result1', 'result2', 'result6'],
    'col6': [10, 20, 30, 40, 10, 20, 30, 40, 10, 20, 30, 50, 20, 100, 10, 10],
    'col7': [102.2, 101.2, 102.3, 101.4, 100.0, 103.0, 104.0, 105.0, 102.0,
             87.0, 107.0, 110.2, 120.0, 88.0, 106.2, 101.1]
})

columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']
res = df.pivot_table(values='col7', index=['col4', 'col5', 'col6'],
                     columns=['col2'], aggfunc='max')
res = (
    res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)
)
print(res)

要获取不带col5的值,请将其从
pivot_表的
索引中删除:

columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']
res = df.pivot_table(values='col7', index=['col4', 'col6'],
                     columns=['col2'], aggfunc='max')
res = (
    res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)
)
或者您可以尝试:

res = df.assign(col7 = df.col7.where(df.col7 > 100)).pivot_table(values='col7', index=['col4', 'col5', 'col6'],
                     columns=['col2'], aggfunc='max', fill_value= '')

我不确定我的描述是否清楚,因为我得到的解决方案与在完整数据集上运行时所需的不同。尽管我在多个列上建立索引,但我的目的是使用col4作为索引以及col5和col6的相应数据来获取最大值。使用建议的sol,col4“Dummy1”重复三次,因为我们有三个唯一的col5标签用于Dummy1,但目的是从col5中仅获取一个数据点,其中col5是对应col4“Dummy1”的最大值。我已经更新了帖子中的输出。如果你愿意,我可以作为一个单独的问题发布。因为,没有其他人回答了原来的问题,如果你能看一下,我将不胜感激。Thanks@Henry我更新了输出表。我展示了它的最终输出,其中包括col4、col5和col6作为索引。我还展示了一个不带col5的输出,它显示了每个列的最大值,但是当您将col5添加到混合中时,表会发生变化,这就是我试图描述的,这是我试图实现的最终输出。Thanks@Henry谢谢你的更新。我需要一张有可乐的桌子。我只是展示了没有col5的情况,仅供参考,说明我是如何创建包含col5的表的。看来我在混音中添加了不含col5的表格可能会引起更多的混乱。我要查找的最后一个输出表是op中注释“Max pivoted output include col5:”下面的表。同样,我不明白为什么
result6
不在结果集中。它高于100阈值。这是我的输出和你的输出之间唯一的区别。。。你在找什么?@Henry result6不在数据集中,因为它不是最高的。对于Dummy1,我们有三个col5值(result1、result2、result6),在所有三个col5值中,我们只尝试获得最高值,即106.2。假设我们只有一列要透视,即“test1”,那么输出应该是Dummy1-result2-10-106.2Okay。我想你是说每个组应该有一个条目,然后你想用对应于最大值的值重新填充col5。在这种情况下,我不明白为什么
Dummy1
在输出表中既有
result2
又有
result1
res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)
     col4     col5  col6  test1  test2  test3  test4 test5
0  Dummy1  result1    10  102.2  100.0  102.0             
1  Dummy1  result2    10  106.2                           
2  Dummy1  result6    10  101.1                           
3  Dummy2  result2    20  101.2  103.0   87.0  120.0      
4  Dummy3  result3    30  102.3  104.0  107.0             
5  Dummy4  result4    40  101.4  105.0                    
6  Dummy5  result4    50                110.2             
import pandas as pd

df = pd.DataFrame({
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
    'col2': ['test1', 'test1', 'test1', 'test1', 'test2', 'test2', 'test2',
             'test2', 'test3', 'test3', 'test3', 'test3', 'test4', 'test5',
             'test1', 'test1'],
    'col3': ['t1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1', 't1',
             't1', 't1', 't1', 't1', 't1'],
    'col4': ['Dummy1', 'Dummy2', 'Dummy3', 'Dummy4', 'Dummy1', 'Dummy2',
             'Dummy3', 'Dummy4', 'Dummy1', 'Dummy2', 'Dummy3', 'Dummy5',
             'Dummy2', 'Dummy6', 'Dummy1', 'Dummy1'],
    'col5': ['result1', 'result2', 'result3', 'result4', 'result1', 'result2',
             'result3', 'result4', 'result1', 'result2', 'result3', 'result4',
             'result2', 'result1', 'result2', 'result6'],
    'col6': [10, 20, 30, 40, 10, 20, 30, 40, 10, 20, 30, 50, 20, 100, 10, 10],
    'col7': [102.2, 101.2, 102.3, 101.4, 100.0, 103.0, 104.0, 105.0, 102.0,
             87.0, 107.0, 110.2, 120.0, 88.0, 106.2, 101.1]
})

columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']
res = df.pivot_table(values='col7', index=['col4', 'col5', 'col6'],
                     columns=['col2'], aggfunc='max')
res = (
    res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)
)
print(res)
columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']
res = df.pivot_table(values='col7', index=['col4', 'col6'],
                     columns=['col2'], aggfunc='max')
res = (
    res[(res >= 100).any(1)].fillna('').reset_index().rename_axis(None, axis=1)
)
     col4  col6  test1  test2  test3  test4 test5
0  Dummy1    10  106.2  100.0  102.0             
1  Dummy2    20  101.2  103.0   87.0  120.0      
2  Dummy3    30  102.3  104.0  107.0             
3  Dummy4    40  101.4  105.0                    
4  Dummy5    50                110.2             
res = df.assign(col7 = df.col7.where(df.col7 > 100)).pivot_table(values='col7', index=['col4', 'col5', 'col6'],
                     columns=['col2'], aggfunc='max', fill_value= '')