标签: pandas-groupby

pandas中的新列 - 通过应用列表groupby将数组添加到数据框中

给出以下内容 df

  Id other  concat
0  A     z       1
1  A     y       2
2  B     x       3
3  B     w       4
4  B     v       5
5  B     u       6
Run Code Online (Sandbox Code Playgroud)

我希望结果包含new带有分组值的列作为列表

  Id other  concat           new
0  A     z       1        [1, 2]
1  A     y       2        [1, 2]
2  B     x       3  [3, 4, 5, 6]
3  B     w       4  [3, 4, 5, 6]
4  B     v       5  [3, 4, 5, 6]
5  B     u       6  [3, 4, 5, 6] …
Run Code Online (Sandbox Code Playgroud)

python group-concat dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
777
查看次数

pandas dataframe:如何计算二进制列中的1行数?

我有以下pandas DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({"first_column": [0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0]})

>>> df
    first_column
0              0
1              0
2              0
3              1
4              1
5              1
6              0
7              0
8              1
9              1
10             0
11             0
12             0
13             0
14             1
15             1
16             1
17             1
18             1
19             0
20             0
Run Code Online (Sandbox Code Playgroud)

first_column …

python group-by dataframe pandas pandas-groupby

7
推荐指数
2
解决办法
818
查看次数

pandas groupby,其中您获得一列的最大值和另一列的最小值

我有一个数据帧如下:

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5
Run Code Online (Sandbox Code Playgroud)

我想要一个数据帧,每个用户的最小值为num1,每个用户的最大值为num2.

输出应该是:

user    num1    num2
a       1       3
b       4       5
Run Code Online (Sandbox Code Playgroud)

我知道如果我想要两列的最大值,我可以这样做:

a.groupby('user')['num1', 'num2'].max()
Run Code Online (Sandbox Code Playgroud)

是否有一些等价物,而不必做以下事情:

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)
Run Code Online (Sandbox Code Playgroud)

python pandas pandas-groupby

7
推荐指数
1
解决办法
1万
查看次数

如何通过另一个列上的值聚合一个列?

假设我有以下df。

df = pd.DataFrame({
    'A':['x','y','x','y'],
    'B':['a','b','a','b'],
    'C':[1,10,100,1000],
    'D':['w','v','v','w']
})

    A   B   C       D
0   x   a   1       w
1   y   b   10      v
2   x   a   100     v
3   y   b   1000    w
Run Code Online (Sandbox Code Playgroud)

我想按A和B列分组,对C列求和,并保留D的值,该值与C的最大分组值在同一行。

A   B   C      D
x   a   101    v
y   b   1010   w
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这个:

df.groupby(['A','B']).agg({'C':sum})

A   B   C
x   a   101
y   b   1010
Run Code Online (Sandbox Code Playgroud)

我必须使用什么功能汇总D列?

pandas pandas-groupby

7
推荐指数
1
解决办法
1388
查看次数

Pandas - 具有来自另一列的条件的groupby列

我正在努力研究如何使用条件对多个列值进行分组:

以下是我的数据作为pandas数据帧的样子:

id      trigger     timestamp
1       started     2017-10-01 14:00:1
1       ended       2017-10-04 12:00:1
2       started     2017-10-02 10:00:1
1       started     2017-10-03 11:00:1
2       ended       2017-10-04 12:00:1    
2       started     2017-10-05 15:00:1
1       ended       2017-10-05 16:00:1
2       ended       2017-10-05 17:00:1
Run Code Online (Sandbox Code Playgroud)

我的目标是找出按ID分组的日期之间的日/小时或分钟差异.

我的输出看起来应该更像这样(在hrs中的diff):

id      trigger     timestamp           trigger     timestamp               diff
1       started     2017-10-01 14:00:1  ended       2017-10-04 12:00:1      70
1       started     2017-10-03 11:00:1  ended       2017-10-05 16:00:1      53
2       started     2017-10-02 10:00:1  ended       2017-10-04 12:00:1      26
2       started     2017-10-05 15:00:1  ended       2017-10-05 17:00:1      2
Run Code Online (Sandbox Code Playgroud)

我尝试了很多选择,但我不能提供最有效的解决方案.

这是我的代码,直到现在:

首先,我尝试将数据拆分为"已启动"和"已结束": …

python group-by dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
1596
查看次数

熊猫Groupby AGG STD NaN

输入:

df['PopEst']
    .astype('float')
    .groupby(ContinentDict)
    .agg(['size','sum','mean','std']))
Run Code Online (Sandbox Code Playgroud)

输出:

            size            sum                mean              std
Asia          5     2.898666e+09       5.797333e+08     6.790979e+08
Australia     1     2.331602e+07       2.331602e+07              NaN
Europe        6     4.579297e+08       7.632161e+07     3.464767e+07
North America 2     3.528552e+08       1.764276e+08     1.996696e+08
South America 1     2.059153e+08       2.059153e+08              NaN
Run Code Online (Sandbox Code Playgroud)

如果该组只有一行,则std列中的某些值会变为NaN,但是我认为这些值应该为0,这是为什么呢?

python std nan pandas pandas-groupby

7
推荐指数
1
解决办法
2003
查看次数

扁平化多指数柱的简洁方法

在groupby-aggregate中使用多个函数会产生一个多索引,然后我想要展平.

例:

df = pd.DataFrame(
    {'A': [1,1,1,2,2,2,3,3,3],
     'B': np.random.random(9),
     'C': np.random.random(9)}
)
out = df.groupby('A').agg({'B': [np.mean, np.std], 'C': np.median})

# example output

          B                   C
       mean       std    median
A
1  0.791846  0.091657  0.394167
2  0.156290  0.202142  0.453871
3  0.482282  0.382391  0.892514
Run Code Online (Sandbox Code Playgroud)

目前,我是这样手动完成的

out.columns = ['B_mean', 'B_std', 'C_median']
Run Code Online (Sandbox Code Playgroud)

这给了我想要的结果

     B_mean     B_std  C_median
A
1  0.791846  0.091657  0.394167
2  0.156290  0.202142  0.453871
3  0.482282  0.382391  0.892514
Run Code Online (Sandbox Code Playgroud)

但是我正在寻找一种自动化这个过程的方法,因为这是单调的,耗时的,并且允许我在重命名列时进行拼写错误.

在进行groupby-aggregate时,有没有办法返回扁平索引而不是多索引?

我需要将列展平以保存到文本文件,然后由不处理多索引列的其他程序读取该文件.

pandas pandas-groupby

7
推荐指数
4
解决办法
3982
查看次数

按ID对列进行求和,但跳过第一个实例?

我有一个如下的数据帧.

A = [{'ID':1, 'Period':1, 'Variable':21}, {'ID':1,'Period':2, 'Variable':12}, 
      {'ID':2, 'Period':2, 'Variable':14}, {'ID':2, 'Period':3, 'Variable':18}]

df = pd.DataFrame(A)
Run Code Online (Sandbox Code Playgroud)

我本来想做一个像df.groupby('ID').sum()获取Variable列总和的操作,但是我需要跳过针对特定ID观察到的第一个周期.因此,对于ID = 1,我在第1期放弃观察,但是对于ID = 2,我在第2期放弃观察.

我怎样才能做到这一点?

python dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
653
查看次数

有条理地通过Pandas分组的值

我正在寻找一种更有效和可维护的方法来有条件地按组抵消价值.最容易展示一个例子.

值始终为非负值Offset == False且始终为负值Offset == True.我要做的是通过Label"折叠"正值(地板为0)和负值.

Note Label+ Offsetcombined总是唯一的.由于Offset是布尔值,因此每个Label最多只能有2行.

例1

df = pd.DataFrame({'Label': ['L1', 'L2', 'L3', 'L3'],
                   'Offset': [False, False, False, True],
                   'Value': [100, 100, 50, -100]})

# input
#   Label Offset  Value
# 0    L1  False    100
# 1    L2  False    100
# 2    L3  False     50
# 3    L3   True   -100
Run Code Online (Sandbox Code Playgroud)

期望的输出:

  Label Offset  Value
0    L1  False    100
1    L2  False    100
2    L3  False      0
3    L3   True …
Run Code Online (Sandbox Code Playgroud)

python performance dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
211
查看次数

定义一个函数使用其他函数名作为参数

我有一个DataFrame如下所示:

df = {'col_1': [1,2,3,4,5,6,7,8,9,10],
      'col_2': [1,2,3,4,5,6,7,8,9,10],
      'col_3':['A','A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(df)
Run Code Online (Sandbox Code Playgroud)

虽然我使用的真实数据有数百列,但我想使用不同的函数来操作这些列min,max 以及自定义函数,如:

def dist(x):
    return max(x) - min(x)
def HHI(x):
    ss = sum([s**2 for s in x])
    return ss
Run Code Online (Sandbox Code Playgroud)

我想要的功能如下:

def myfunc(cols,fun):
    return df.groupby('col_3')[[cols]].transform(lambda x: fun)
# which allow me to do something like:

df[['min_' + s for s in cols]] = myfunc(cols, min)
df[['max_' + s for s in cols]] = myfunc(cols, max)
df[['dist_' + s for s in cols]] = myfunc(cols, dist)
Run Code Online (Sandbox Code Playgroud)

这在Python中是否可行(我的猜测是'是')?
那如果是的话呢? …

python function dataframe pandas pandas-groupby

7
推荐指数
1
解决办法
189
查看次数