这里提出了一个类似的问题: Python:使用groupby获取具有最大值的行
但是,即使在该组中有多个具有最大值的记录,我每组只需要一条记录.
在下面的例子中,我需要一个"s2"记录.对我来说哪一个并不重要.
>>> df = DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'count':[3,2,5,10,10,6]})
>>> df
Mt Sp Value count
0 s1 a 1 3
1 s1 b 2 2
2 s2 c 3 5
3 s2 d 4 10
4 s2 e 5 10
5 s3 f 6 6
>>> idx = df.groupby(['Mt'])['count'].transform(max) == df['count']
>>> df[idx]
Mt Sp Value count
0 s1 a 1 3
3 s2 d 4 10
4 s2 e 5 10
5 s3 f 6 …Run Code Online (Sandbox Code Playgroud) 我有以下数据帧:
obj_id data_date value
0 4 2011-11-01 59500
1 2 2011-10-01 35200
2 4 2010-07-31 24860
3 1 2009-07-28 15860
4 2 2008-10-15 200200
Run Code Online (Sandbox Code Playgroud)
我想得到这些数据的一个子集,这样我每个都只有最新的(最大的'data_date')数据.'value''obj_id'
我已经破解了一个解决方案,但感觉很脏.我想知道是否有人有更好的方法.我敢肯定我必须错过一些通过熊猫这么简单的方法.
我的方法主要是分组,排序,检索和重组,如下所示:
row_arr = []
for grp, grp_df in df.groupby('obj_id'):
row_arr.append(dfg.sort('data_date', ascending = False)[:1].values[0])
df_new = DataFrame(row_arr, columns = ('obj_id', 'data_date', 'value'))
Run Code Online (Sandbox Code Playgroud) 我有一个大数据框(从 500k 到 1M 行),其中包含例如以下 3 个数字列:ID、A、B
我想过滤结果以获得如下图所示的表格,其中,对于列 id 的每个唯一值,我有 A 和 B 的最大值和最小值。我该怎么办?
编辑:为了更清楚,我更新了下面的图片:当我从一列中获得最大值或最小值时,我还需要获得其他列的与其相关的数据
我改回了我的问题.我正在寻找以下问题的解决方案:
我有一个dataFrame,如:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Run Code Online (Sandbox Code Playgroud)
我的目标是获得每组中所有行数最大的行,例如:
MM4 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
Run Code Online (Sandbox Code Playgroud)
我按['Sp','Mt'分组
有人知道我怎么能在熊猫或python中做到这一点?
数据集包含4列,其中name是孩子的名字,yearofbirth表示孩子出生的年份,number表示使用该特定姓名命名的婴儿数.
For example, entry 1 reads, in the year 1880, 7065 girl children were named Mary.
Run Code Online (Sandbox Code Playgroud)
通过大熊猫,我试图找出每年哪个名字最常用的名字.我的代码
df.groupby(['yearofbirth']).agg({'number':'max'}).reset_index()
Run Code Online (Sandbox Code Playgroud)
上面的代码部分回答了手头的问题.
我想要名字和最大数字.
简单数据框:
df = pd.DataFrame({'A': [1,1,2,2], 'B': [0,1,2,3], 'C': ['a','b','c','d']})
df
A B C
0 1 0 a
1 1 1 b
2 2 2 c
3 2 3 d
Run Code Online (Sandbox Code Playgroud)
我希望groupbyA 列的每个值 ( ) 都得到 C 列的值,B 列的值最大。例如对于A列的第1组,B列的最大值为1,所以我想要C列的值“b”:
A C
0 1 b
1 2 d
Run Code Online (Sandbox Code Playgroud)
无需假设 B 列已排序,性能是重中之重,其次是优雅。
我试图从 X 列中删除连续的重复项,同时保留基于 Y 列的最大值的条目,不幸的是没有成功。数据框如下:
| idx | X | 是 |
|---|---|---|
| 0 | A | 3 |
| 1 | 乙 | 2 |
| 2 | A | 7 |
| 3 | A | 10 |
| 4 | 乙 | 1 |
| 5 | C | 4 |
| 6 | A | 3 |
| 7 | A | 3 |
我想要实现的是:
| idx | X | 是 |
|---|---|---|
| 0 | A | 3 |
| 1 | 乙 | 2 |
| 3 | A | 10 |
| 4 | 乙 | 1 |
| 5 | C | 4 |
| 7 | A | 3 |
我发现的大多数解决方案只是删除重复的内容,而不考虑任何重复的模式。
请注意,重复项可能具有相同的值。
从这样的事情开始:
from pandas import DataFrame
time = np.array(('2015-08-01T00:00:00','2015-08-01T12:00:00'),dtype='datetime64[ns]')
heat_index = np.array([101,103])
air_temperature = np.array([96,95])
df = DataFrame({'heat_index':heat_index,'air_temperature':air_temperature},index=time)
Run Code Online (Sandbox Code Playgroud)
产生这个df:
air_temperature heat_index
2015-08-01 07:00:00 96 101
2015-08-01 19:00:00 95 103
Run Code Online (Sandbox Code Playgroud)
然后每天重新采样:
df_daily = df.resample('24H',how='max')
Run Code Online (Sandbox Code Playgroud)
为此得到df_daily:
air_temperature heat_index
2015-08-01 96 103
Run Code Online (Sandbox Code Playgroud)
因此,通过how='max'每24小时使用pandas重新采样重新采样,从每列中获取该时间段内的最大值.
但正如你所看到的看着df输出2015-08-01,当天的最大热指数(发生在19:00:00)不相关的空气温度发生在同一时间.也就是说,在空气温度为95°F时引起103°的热指数.这种关联通过重新取样而丢失,我们最终会从一天中的不同时间看到空气温度.
有没有办法只重新采样一列,并将值保留在同一索引的另一列中?所以最终结果如下:
air_temperature heat_index
2015-08-01 95 103
Run Code Online (Sandbox Code Playgroud)
我的第一个猜测就是重新对该heat_index列进行重新采样......
df_daily = df.resample('24H',how={'heat_index':'max'})
Run Code Online (Sandbox Code Playgroud)
要得到...
air_temperature
2015-08-01 103
Run Code Online (Sandbox Code Playgroud)
...然后尝试从那里做某种DataFrame.loc或DataFrame.ix,但一直没有成功.关于如何在重新采样后找到相关值的任何想法(例如,找到与air_temperature后来发现的最大值同时发生的值heat_index)?
我有一个像这样的数据框:
timestamp Order Price Quantity
0 2019-10-09 09:15:42 0 27850.00 2040
1 2019-10-09 09:15:42 0 27850.00 1980
2 2019-10-09 09:15:53 0 27860.85 1800
3 2019-10-09 09:16:54 0 27860.85 2340
4 2019-10-09 09:18:48 0 27860.85 1500
5 2019-10-09 09:21:08 0 27979.00 1840
6 2019-10-09 09:21:08 0 27979.00 2020
7 2019-10-09 09:21:12 0 27850.00 1800
8 2019-10-09 09:21:15 0 27850.00 1580
9 2019-10-09 09:21:21 35 28000.00 1840
10 2019-10-09 09:21:23 34 28000.00 1800
11 2019-10-09 09:28:17 0 28035.00 2020
12 2019-10-09 09:28:18 …Run Code Online (Sandbox Code Playgroud)