pandas 如何根据值列出 Dataframe 的值

dddzy1tm  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(116)

我有一些产品数据,我试图分析,但返回的产品和年份,它达到了一定的阈值。它看起来有点像这样:

Product     2006.0  2007.0  2008.0  2009.0  2010.0  2011.0
0   A           10.0    12.0    13.0    15.0    18.0    23.0
1   B           30.0    20.0    25.0    27.0    30.0    35.0
2   C           15.0    25.0    28.0    30.0    36.0    40.0
3   D           8.0     20.0    32.0    44.0    56.0    58.0

...

7   C           15.0    25.0    28.0    30.0    36.0    40.0
8   D           8.0     20.0    32.0    44.0    56.0    58.0
9   E           61.0    72.0    76.0    85.0    68.0    60.0
10  A           10.0    12.0    13.0    15.0    18.0    23.0

我尝试了一个简单的apply函数来跨行运行,并返回超过阈值的年份和产品。
还在学习Pandas。帮助是一如既往的感激。
我确实考虑过set_index for product,然后在多年的数据中运行map,但这似乎不是很有效。

6yt4nkrj

6yt4nkrj1#

您可以使用dot产品:

thresh = 30

cols = df.columns[df.columns.str.contains(r'\d{4}')]
df['t>30'] = df[cols].gt(thresh).dot(cols.astype(str) + ',').str.split(',').str[0]

输出:

>>> df
   Product  2006.0  2007.0  2008.0  2009.0  2010.0  2011.0    t>30
0        A    10.0    12.0    13.0    15.0    18.0    23.0        
1        B    30.0    20.0    25.0    27.0    30.0    35.0  2011.0
2        C    15.0    25.0    28.0    30.0    36.0    40.0  2010.0
3        D     8.0    20.0    32.0    44.0    56.0    58.0  2008.0
7        C    15.0    25.0    28.0    30.0    36.0    40.0  2010.0
8        D     8.0    20.0    32.0    44.0    56.0    58.0  2008.0
9        E    61.0    72.0    76.0    85.0    68.0    60.0  2006.0
10       A    10.0    12.0    13.0    15.0    18.0    23.0

一步一步:

>>> out = df[cols].gt(thresh)
    2006.0  2007.0  2008.0  2009.0  2010.0  2011.0
0    False   False   False   False   False   False
1    False   False   False   False   False    True
2    False   False   False   False    True    True
3    False   False    True    True    True    True
7    False   False   False   False    True    True
8    False   False    True    True    True    True
9     True    True    True    True    True    True
10   False   False   False   False   False   False

>>> out = out.dot(cols.astype(str) + ',')
0                                               
1                                        2011.0,
2                                 2010.0,2011.0,
3                   2008.0,2009.0,2010.0,2011.0,
7                                 2010.0,2011.0,
8                   2008.0,2009.0,2010.0,2011.0,
9     2006.0,2007.0,2008.0,2009.0,2010.0,2011.0,
10                                              
dtype: object

>>> out = out.str.split(',')
0                                                    []
1                                            [2011.0, ]
2                                    [2010.0, 2011.0, ]
3                    [2008.0, 2009.0, 2010.0, 2011.0, ]
7                                    [2010.0, 2011.0, ]
8                    [2008.0, 2009.0, 2010.0, 2011.0, ]
9     [2006.0, 2007.0, 2008.0, 2009.0, 2010.0, 2011....
10                                                   []
dtype: object

>>> df['t>30'] = out.str[0]
0           
1     2011.0
2     2010.0
3     2008.0
7     2010.0
8     2008.0
9     2006.0
10          
Name: t>30, dtype: object

更新如果要按产品汇总,可以按产品分组并保留每年的最高值(因为最高值最有可能超过阈值):

>>> (df.groupby('Product')[cols].max().gt(30)
       .dot(cols.astype(str) + ',').str.split(',').str[0]
       .rename('Year').reset_index())
  Product    Year
0       A        
1       B  2011.0
2       C  2010.0
3       D  2008.0
4       E  2006.0
lvmkulzt

lvmkulzt2#

第一:

df.set_index('Product', inplace=True)
matches = df > 30

现在matches是:

2006   2007   2008   2009   2010   2011
Product                                          
A        False  False  False  False  False  False
B        False  False  False  False  False   True
C        False  False  False  False   True   True
D        False  False   True   True   True   True
C        False  False  False  False   True   True
D        False  False   True   True   True   True
E         True   True   True   True   True   True
A        False  False  False  False  False  False

然后您可以:

matches.any(0)         

2006    True
2007    True
2008    True
2009    True
2010    True
2011    True

matches.any(1)        

Product
A    False
B     True
C     True
D     True
C     True
D     True
E     True
A    False

相关问题