这应该是直截了当的,但我发现的最接近的是这篇文章: 熊猫:填写组内的缺失值,我仍然无法解决我的问题....
假设我有以下数据帧
df = pd.DataFrame({'value': [1, np.nan, np.nan, 2, 3, 1, 3, np.nan, 3], 'name': ['A','A', 'B','B','B','B', 'C','C','C']})
name value
0 A 1
1 A NaN
2 B NaN
3 B 2
4 B 3
5 B 1
6 C 3
7 C NaN
8 C 3
Run Code Online (Sandbox Code Playgroud)
并且我想在每个"名称"组中填写"NaN",其中包含平均值
name value
0 A 1
1 A 1
2 B 2
3 B 2
4 B 3
5 B 1
6 C 3
7 C 3
8 C 3
Run Code Online (Sandbox Code Playgroud)
我不确定去哪里: …
尝试使用groupby计算创建新列.在下面的代码中,我得到了每个日期的正确计算值(参见下面的组),但是当我尝试用它创建一个新列(df ['Data4'])时,我得到了NaN.因此,我尝试在数据框中创建一个新列,其中包含所有日期的"Data3"总和,并将其应用于每个日期行.例如,2015-05-08分为2行(总数为50 + 5 = 55),在这个新列中,我想在两行中都有55行.
import pandas as pd
import numpy as np
from pandas import DataFrame
df = pd.DataFrame({'Date': ['2015-05-08', '2015-05-07', '2015-05-06', '2015-05-05', '2015-05-08', '2015-05-07', '2015-05-06', '2015-05-05'], 'Sym': ['aapl', 'aapl', 'aapl', 'aapl', 'aaww', 'aaww', 'aaww', 'aaww'], 'Data2': [11, 8, 10, 15, 110, 60, 100, 40],'Data3': [5, 8, 6, 1, 50, 100, 60, 120]})
group = df['Data3'].groupby(df['Date']).sum()
df['Data4'] = group
Run Code Online (Sandbox Code Playgroud) 我正在使用groupbypandas数据帧删除所有没有特定列的最小行.像这样的东西:
df1 = df.groupby("item", as_index=False)["diff"].min()
Run Code Online (Sandbox Code Playgroud)
但是,如果我有超过这两列,则其他列将被删除.我可以使用groupby保留这些列,还是我必须找到一种不同的方法来删除行?
我的数据如下:
item diff otherstuff
0 1 2 1
1 1 1 2
2 1 3 7
3 2 -1 0
4 2 1 3
5 2 4 9
6 2 -6 2
7 3 0 0
8 3 2 9
Run Code Online (Sandbox Code Playgroud)
并应该最终像:
item diff otherstuff
0 1 1 2
1 2 -6 2
2 3 0 0
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
item diff
0 1 1
1 2 -6
2 3 0
Run Code Online (Sandbox Code Playgroud)
我一直在查看文档,找不到任何东西.我试过了:
df1 = df.groupby(["item", …Run Code Online (Sandbox Code Playgroud) 如何对pandas数据帧的值进行分组并从每个组中选择最新的(按日期)?
例如,给定按日期排序的数据框:
id product date
0 220 6647 2014-09-01
1 220 6647 2014-09-03
2 220 6647 2014-10-16
3 826 3380 2014-11-11
4 826 3380 2014-12-09
5 826 3380 2015-05-19
6 901 4555 2014-09-01
7 901 4555 2014-10-05
8 901 4555 2014-11-01
Run Code Online (Sandbox Code Playgroud)
按ID或产品分组,并选择最早的给出:
id product date
2 220 6647 2014-10-16
5 826 3380 2015-05-19
8 901 4555 2014-11-01
Run Code Online (Sandbox Code Playgroud) 我有一个grouped类型的时间序列对象<pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>.grouped.sum()给出了期望的结果,但我无法使用rolling_sum来处理groupby对象.有没有办法将滚动功能应用于groupby对象?例如:
x = range(0, 6)
id = ['a', 'a', 'a', 'b', 'b', 'b']
df = DataFrame(zip(id, x), columns = ['id', 'x'])
df.groupby('id').sum()
id x
a 3
b 12
Run Code Online (Sandbox Code Playgroud)
但是,我希望有类似的东西:
id x
0 a 0
1 a 1
2 a 3
3 b 3
4 b 7
5 b 12
Run Code Online (Sandbox Code Playgroud) python pandas rolling-computation rolling-sum pandas-groupby
这将是有用的,所以我知道有多少我必须执行计算的唯一组.谢谢.
假设调用groupby对象dfgroup.
我的第一个问题:我对pandas(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎将函数TWICE应用于数据帧的第一行.例如:
>>> from pandas import Series, DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]})
>>> print(df)
class count
0 A 1
1 B 0
2 C 2
Run Code Online (Sandbox Code Playgroud)
我首先检查groupby函数是否正常,看起来没问题:
>>> for group in df.groupby('class', group_keys = True):
>>> print(group)
('A', class count
0 A 1)
('B', class count
1 B 0)
('C', class count
2 C 2)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在groupby对象上使用apply做类似的事情,我得到第一行输出两次:
>>> def checkit(group):
>>> print(group)
>>> df.groupby('class', group_keys = True).apply(checkit)
class count
0 A 1
class count …Run Code Online (Sandbox Code Playgroud) 使用groupby和并行的最有效方法是在pandas中应用过滤器?
基本上我要求SQL中的等价物
select *
...
group by col_name
having condition
Run Code Online (Sandbox Code Playgroud)
我认为有很多用例,包括条件均值,总和,条件概率等,这些都会使这样的命令非常强大.
我需要一个非常好的性能,所以理想情况下这样的命令不会是在python中完成的几个分层操作的结果.
我有以下数据帧:
df = pd.DataFrame([
(1, 1, 'term1'),
(1, 2, 'term2'),
(1, 1, 'term1'),
(1, 1, 'term2'),
(2, 2, 'term3'),
(2, 3, 'term1'),
(2, 2, 'term1')
], columns=['id', 'group', 'term'])
Run Code Online (Sandbox Code Playgroud)
我把它通过想组id和group并计算每个词的数量为这个ID,组对.
所以最后我会得到这样的东西:
通过循环遍历所有行df.iterrows()并创建新数据帧,我能够实现我想要的目标,但这显然效率低下.(如果有帮助,我事先知道所有术语的列表,其中有~10个).
看起来我必须分组然后计算值,所以我尝试使用df.groupby(['id', 'group']).value_counts()哪个不起作用,因为value_counts在groupby系列而不是数据帧上运行.
无论如何,我可以实现这一点而不循环?
我有以下pandas数据帧:
dfalph.head()
token year uses books
386 xanthos 1830 3 3
387 xanthos 1840 1 1
388 xanthos 1840 2 2
389 xanthos 1868 2 2
390 xanthos 1875 1 1
Run Code Online (Sandbox Code Playgroud)
我使用重复令牌聚合行,并且如下所示:
dfalph = dfalph[['token','year','uses','books']].groupby(['token', 'year']).agg([np.sum])
dfalph.columns = dfalph.columns.droplevel(1)
dfalph.head()
uses books
token year
xanthos 1830 3 3
1840 3 3
1867 2 2
1868 2 2
1875 1 1
Run Code Online (Sandbox Code Playgroud)
我没有在索引中使用'token'和'year'字段,而是希望将它们返回到列并具有整数索引.
pandas ×10
pandas-groupby ×10
python ×10
group-by ×3
dataframe ×2
aggregate ×1
crosstab ×1
fillna ×1
imputation ×1
multi-index ×1
rolling-sum ×1