Pandas 这对熊猫有可能吗?

Pandas 这对熊猫有可能吗?,pandas,Pandas,我的数据集如下所示: Date COL1 COL2 COL3 2017/01/01 123 A N 2017/01/01 234 A N 2017/01/01 567 A Y 2017/01/01 111 B N 2017/01/02 123 A Y 2017/01/02 999 A N 2017/01/02 3

我的数据集如下所示:

Date        COL1    COL2    COL3
2017/01/01   123      A       N
2017/01/01   234      A       N
2017/01/01   567      A       Y
2017/01/01   111      B       N
2017/01/02   123      A       Y
2017/01/02   999      A       N
2017/01/02   333      A       Y
2017/01/02   444      B       N
2017/01/02   555      B       Y
期望输出

Date        COL2  Count
2017/01/01   A      1
2017/01/01   B      1
2017/01/02   A      0
2017/01/02   B      1
所需输出的说明:

我想对COL2中属于特定组的COL1行求和,如果COL3的值为N,则只求和;如果COL3的值为Y,则求差

(应为滚动总和,当前计算基于前一日期和今天日期的总和)

我提出了一个python脚本,它首先创建一个映射,关键是COL2,值是date和COL1的元组。 然后脚本循环遍历整个数据集,在此过程中,如果当前行不在映射中,我将其添加到映射中,如果当前行在映射中,我将其追加。
然后,我只是在创建的映射中循环,并检查每个条目的大小以得出计数

然而,我想学习如何使用pandas实现这一点,我尝试使用groupby和aggregate,但无法获得正确的格式


任何帮助都将不胜感激。

解决方案是在
pandas
中创建一个自定义聚合器,然后在列上创建一个

>> from pandas import DataFrame as df >>> df_ = df({'col': [1, 1, 1, 2, 2, 2], 'a': ['A', 'A', 'B', 'A', 'B', 'B'], 'b': ['N', 'N', 'Y', 'Y', 'N', 'Y']}) >> df_ a b col 0 A N 1 1 A N 1 2 B Y 1 3 A Y 2 4 B N 2 5 B Y 2 >> f = lambda a: list(a).count('N')-list(a).count('Y') # custom aggregation after grouping >> agg_df = df_.groupby(['col', 'a']).agg({'b': f}).reset_index() >> agg_df col a b 0 1 A 2 1 1 B -1 2 2 A -1 3 2 B 0 >>从中导入数据帧作为df >>>df=df({'col':[1,1,1,2,2],'a':['a','a','B','a','B','B'],'B':['N','N','Y','N','Y'] >>df_ a b柱 0 A N 1 1 A N 1 2b Y 1 3 A Y 2 4 B N 2 5b Y 2 >>f=lambda:list(a).count('N')-list(a).count('Y')#分组后的自定义聚合 >>agg_df=df_.groupby(['col','a']).agg({'b':f}).reset_index() >>agg_-df a、b列 0 1 A 2 1 B-1 2 A-1 32B0
希望这有帮助。

假设您同时按日期和COL2分组,下面是一个单行解决方案:

创建数据帧:

>>> import pandas as pd
>>> df = pd.DataFrame({'Date': ['2017/01/01', '2017/01/01', '2017/01/01', '2017/01/02', '2017/01/02', '2017/01/02'], 
                   'COL1': [123, 234, 135, 123, 135, 246], 
                   'COL2': ['A', 'A', 'B', 'A', 'B', 'B'], 
                   'COL3': ['N', 'N', 'Y', 'N', 'N', 'Y']})
>>> df
    Date        COL1    COL2    COL3
0   2017/01/01  123     A       N
1   2017/01/01  234     A       N
2   2017/01/01  135     B       Y
3   2017/01/02  123     A       N
4   2017/01/02  135     B       N
5   2017/01/02  246     B       Y
>>> df.join(((df.COL3 == 'N')*2 - 1).rename('Count').to_frame()).groupby(['Date','COL2']).Count.sum().groupby(level=[1]).cumsum().reset_index()
        Date    COL2    Count
0   2017/01/01  A       2
1   2017/01/01  B       -1
2   2017/01/02  A       3
3   2017/01/02  B       -1
一行代码:

>>> import pandas as pd
>>> df = pd.DataFrame({'Date': ['2017/01/01', '2017/01/01', '2017/01/01', '2017/01/02', '2017/01/02', '2017/01/02'], 
                   'COL1': [123, 234, 135, 123, 135, 246], 
                   'COL2': ['A', 'A', 'B', 'A', 'B', 'B'], 
                   'COL3': ['N', 'N', 'Y', 'N', 'N', 'Y']})
>>> df
    Date        COL1    COL2    COL3
0   2017/01/01  123     A       N
1   2017/01/01  234     A       N
2   2017/01/01  135     B       Y
3   2017/01/02  123     A       N
4   2017/01/02  135     B       N
5   2017/01/02  246     B       Y
>>> df.join(((df.COL3 == 'N')*2 - 1).rename('Count').to_frame()).groupby(['Date','COL2']).Count.sum().groupby(level=[1]).cumsum().reset_index()
        Date    COL2    Count
0   2017/01/01  A       2
1   2017/01/01  B       -1
2   2017/01/02  A       3
3   2017/01/02  B       -1
说明:

>>> import pandas as pd
>>> df = pd.DataFrame({'Date': ['2017/01/01', '2017/01/01', '2017/01/01', '2017/01/02', '2017/01/02', '2017/01/02'], 
                   'COL1': [123, 234, 135, 123, 135, 246], 
                   'COL2': ['A', 'A', 'B', 'A', 'B', 'B'], 
                   'COL3': ['N', 'N', 'Y', 'N', 'N', 'Y']})
>>> df
    Date        COL1    COL2    COL3
0   2017/01/01  123     A       N
1   2017/01/01  234     A       N
2   2017/01/01  135     B       Y
3   2017/01/02  123     A       N
4   2017/01/02  135     B       N
5   2017/01/02  246     B       Y
>>> df.join(((df.COL3 == 'N')*2 - 1).rename('Count').to_frame()).groupby(['Date','COL2']).Count.sum().groupby(level=[1]).cumsum().reset_index()
        Date    COL2    Count
0   2017/01/01  A       2
1   2017/01/01  B       -1
2   2017/01/02  A       3
3   2017/01/02  B       -1

我首先创建了另一列,从
COL3
中导出求和值,将其命名为
Count
,然后继续执行groupby
sum
,以获得每个
日期
COL2
组合的求和,最后,在
COL2
级别上的groupby
cumsum
来获得滚动计数。

只是想知道,为什么您期望的输出中,2017/01/02 a的值有2个作为计数。@KiriteeGak,很抱歉输入错误。修正了期望的输出。如果COL3为N,则加,如果COL3为Y,则减。谢谢-您如何将其应用于timeseries?对不起,我还在学熊猫。例如,不是第一行0 1 A 2,而是2017/01/01 A 2。您必须将索引设置为日期列。但这在你的情况下并不是独一无二的。因为您已按
date
COL2
对其进行了分组。因此,可以将索引设置为这两列。但是无论如何,语法应该是
df.set\u index('some\u column')
。看看谢谢你的帮助谢谢,但是我认为你在解决一个不同的问题。例如,所需的输出将是(第一行)。2017/01/01 A 2(第二排)2017/01/01 B-1。(第三排)2017/01/02 A 3。(第四排)2017/01/02 B-1。所以基本上,对于第一行,我不想求123+234的和,我想看到2,因为它们都是“N”并且适合A类。你的问题实际上提到:“我想对属于
COL2
中特定组的
COL1
行求和,并且仅当
COL3
的值为N时求和,如果
COL3
的值为Y时进行减法"; 你是说如果
COL3
是'N',你想对计数加1,如果
COL3
是'Y',你想对计数加-1?在这种情况下更容易,你只需删除
df.COL1
部分,你就会得到累计计数是,因此在你的例子中,不是求和123+234,而是求和1+1,因为对于类别(COL2),两者都是'N'“A”。这将导致第一排是2017/01/01 A 2。如果我在描述中没有明确说明,请原谅。让我们来看看。