给出以下内容 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) 我有以下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 …
我有一个数据帧如下:
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) 假设我有以下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数据帧的样子:
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)
我尝试了很多选择,但我不能提供最有效的解决方案.
这是我的代码,直到现在:
首先,我尝试将数据拆分为"已启动"和"已结束": …
输入:
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,这是为什么呢?
在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时,有没有办法返回扁平索引而不是多索引?
我需要将列展平以保存到文本文件,然后由不处理多索引列的其他程序读取该文件.
我有一个如下的数据帧.
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期放弃观察.
我怎样才能做到这一点?
我正在寻找一种更有效和可维护的方法来有条件地按组抵消价值.最容易展示一个例子.
值始终为非负值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) 我有一个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中是否可行(我的猜测是'是')?
那如果是的话呢? …
pandas ×10
pandas-groupby ×10
python ×8
dataframe ×6
group-by ×2
function ×1
group-concat ×1
nan ×1
performance ×1
std ×1