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
,然后继续执行groupbysum
,以获得每个日期
,COL2
组合的求和,最后,在COL2
级别上的groupbycumsum
来获得滚动计数。只是想知道,为什么您期望的输出中,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。如果我在描述中没有明确说明,请原谅。让我们来看看。